Como definir o título da seção UITableView programaticamente (iPhone / iPad)?

106

Criei um UITableViewno Interface Builder usando storyboards. O UITableViewé configurado com static cellsuma série de seções diferentes.

O problema que estou tendo é que estou tentando configurar meu aplicativo em vários idiomas diferentes. Para fazer isso, preciso ser capaz de alterar os UITableViewtítulos das seções de alguma forma.

Por favor, alguém pode me ajudar? Idealmente, gostaria de abordar o problema usando, IBOutletsporém, suspeito que isso nem seja possível neste caso. Quaisquer conselhos e sugestões seriam muito apreciados.

Desde já, obrigado.

O chimpanzé louco
fonte

Respostas:

280

Depois de conectar seu UITableView delegateedatasource seu controlador, você pode fazer algo assim:

ObjC

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    NSString *sectionName;
    switch (section) {
        case 0:
            sectionName = NSLocalizedString(@"mySectionName", @"mySectionName");
            break;
        case 1:
            sectionName = NSLocalizedString(@"myOtherSectionName", @"myOtherSectionName");
            break;
        // ...
        default:
            sectionName = @"";
            break;
    }    
    return sectionName;
}

Rápido

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    let sectionName: String
    switch section {
        case 0:
            sectionName = NSLocalizedString("mySectionName", comment: "mySectionName")
        case 1:
            sectionName = NSLocalizedString("myOtherSectionName", comment: "myOtherSectionName")
        // ...
        default:
            sectionName = ""
    }
    return sectionName
}
Aladiniano
fonte
Você tem certeza de que realmente será chamado se configurar o storyboard usando células estáticas? Não parece que está sendo invocado.
empate em
7
Ah, parece que você tem que implementar numberOfSectionsInTableView:tableView:para que seja chamado.
desenhou em
Para células estáticas, (a maioria) todos os outros métodos de fonte de dados não são implementados.
wcochran de
2
@drewish numberOfSectionsInTableView:tableView:implementado em IB para células estáticas.
wcochran de
drewish está certo - se você implementar numberOfSectionsInTableView:, o método do título será chamado e substituirá o storyboard. Como esta é uma tableview estática, não há problema em substituí-la por um método que retorna um número constante @wcochran
GreatWiz
16

Se você estiver escrevendo código em Swift, seria um exemplo como este

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
{
    switch section
    {
        case 0:
            return "Apple Devices"
        case 1:
            return "Samsung Devices"
        default:
            return "Other Devices"
    }
}
BCI
fonte
10

Use o método UITableViewDataSource

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
gerald William
fonte
5

titleForHeaderInSection é um método delegado de UITableView para aplicar o texto do cabeçalho da seção de gravação da seguinte maneira,

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
              return @"Hello World";
}
iAnkit
fonte
3

Observe que -(NSString *)tableView: titleForHeaderInSection:não é chamado por UITableView se - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionfor implementado no delegado de UITableView;

Julian D.
fonte
2
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
   return 45.0f; 
//set height according to row or section , whatever you want to do!
}

o texto do rótulo da seção está definido.

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *sectionHeaderView;

        sectionHeaderView = [[UIView alloc] initWithFrame:
                             CGRectMake(0, 0, tableView.frame.size.width, 120.0)];


    sectionHeaderView.backgroundColor = kColor(61, 201, 247);

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:
                            CGRectMake(sectionHeaderView.frame.origin.x,sectionHeaderView.frame.origin.y - 44, sectionHeaderView.frame.size.width, sectionHeaderView.frame.size.height)];

    headerLabel.backgroundColor = [UIColor clearColor];
    [headerLabel setTextColor:kColor(255, 255, 255)];
    headerLabel.textAlignment = NSTextAlignmentCenter;
    [headerLabel setFont:kFont(20)];
    [sectionHeaderView addSubview:headerLabel];

    switch (section) {
        case 0:
            headerLabel.text = @"Section 1";
            return sectionHeaderView;
            break;
        case 1:
            headerLabel.text = @"Section 2";
            return sectionHeaderView;
            break;
        case 2:
            headerLabel.text = @"Section 3";
            return sectionHeaderView;
            break;
        default:
            break;
    }

    return sectionHeaderView;
}
Manjeet
fonte
2

Nada de errado com as outras respostas, mas esta oferece uma solução não programática que pode ser útil em situações onde se tem uma pequena mesa estática. A vantagem é que se pode organizar as localizações usando o storyboard. Pode-se continuar a exportar localizações do Xcode via arquivos XLIFF. O Xcode 9 também possui várias novas ferramentas para facilitar as localizações .

(original)

Eu tinha um requisito semelhante. Eu tinha uma tabela estática com células estáticas em meu Main.storyboard (Base). Para localizar títulos de seção usando arquivos .string, por exemplo, Main.strings (alemão), basta selecionar a seção no storyboard e observar o ID do objeto

ID do objeto

Em seguida, vá para o seu arquivo de string, no meu caso Main.strings (alemão) e insira a tradução como:

"MLo-jM-tSN.headerTitle" = "Localized section title";

Recursos adicionais:

igoMobile
fonte
1

Não sei sobre as versões anteriores dos UITableViewprotocolos, mas a partir do iOS 9, func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?faz parte do UITableViewDataSourceprotocolo.

   class ViewController: UIViewController {

      @IBOutlet weak var tableView: UITableView!

      override func viewDidLoad() {
         super.viewDidLoad()
         tableView.dataSource = self
      }
   }

   extension ViewController: UITableViewDataSource {
      func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
         return "Section name"
      }
   }

Você não precisa declarar o delegatepara preencher sua tabela com dados.

Morgan Wilde
fonte