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.

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
}

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"
    }
}

10

Use o método UITableViewDataSource

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

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";
}

3

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


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;
}

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:


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.