¿Cómo configurar el título de la sección UITableView mediante programación (iPhone / iPad)?

106

Creé un UITableViewen Interface Builder usando storyboards. losUITableView está configurado con static cellsy un número de diferentes secciones.

El problema que tengo es que estoy intentando configurar mi aplicación en varios idiomas diferentes. Para hacer esto, necesito poder cambiar elUITableView títulos de secciones de alguna manera.

Por favor, ¿alguien puede ayudarme? Idealmente, me gustaría abordar el problema utilizando, IBOutletssin embargo, sospecho que esto ni siquiera es posible en este caso. Cualquier consejo y sugerencia será muy apreciado.

Gracias por adelantado.

El chimpancé loco
fuente

Respuestas:

280

Una vez que haya conectado su UITableView delegatey datasourcesu controlador, puede hacer algo como esto:

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
}
Aladino
fuente
¿Estás seguro de que realmente se llama si configuras el storyboard usando celdas estáticas? No parece que esté siendo invocado.
empató el
7
Ah, parece que tienes que implementarlo numberOfSectionsInTableView:tableView:para que se llame.
empató el
Para las celdas estáticas, (la mayoría) todos los demás métodos de fuente de datos no se implementan.
wcochran
2
@drewish numberOfSectionsInTableView:tableView:implementado en IB para celdas estáticas.
wcochran
drewish es correcto: si lo implementa numberOfSectionsInTableView:, se llama al método del título y se anula el guión gráfico. Dado que esta es una vista de tabla estática, está bastante bien anularla con un método que devuelva un número constante @wcochran
GreatWiz
16

Si está escribiendo código en Swift, se vería como un ejemplo 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
fuente
10

Utilice el método UITableViewDataSource

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
geraldWilliam
fuente
5

titleForHeaderInSection es un método delegado de UITableView, por lo que para aplicar el texto del encabezado de la sección, escriba de la siguiente manera,

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

Tenga en cuenta que -(NSString *)tableView: titleForHeaderInSection:UITableView no lo llama si - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionse implementa en un delegado de UITableView;

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

el texto de la etiqueta de sección está configurado.

- (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
fuente
2

No hay nada de malo con las otras respuestas, pero esta ofrece una solución no programática que puede ser útil en situaciones en las que se tiene una pequeña tabla estática. El beneficio es que se pueden organizar las localizaciones usando el guión gráfico. Uno puede continuar exportando localizaciones de Xcode a través de archivos XLIFF. Xcode 9 también tiene varias herramientas nuevas para facilitar las localizaciones .

(original)

Tenía un requisito similar. Tenía una tabla estática con celdas estáticas en mi Main.storyboard (Base). Para localizar títulos de sección usando archivos .string, por ejemplo, Main.strings (alemán), simplemente seleccione la sección en el guión gráfico y anote el ID del objeto

ID de objeto

Luego, vaya a su archivo de cadena, en mi caso Main.strings (alemán) e inserte la traducción como:

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

Recursos adicionales:

igoMobile
fuente
1

No conozco las versiones anteriores de los UITableViewprotocolos, pero a partir de iOS 9, func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?es parte del 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"
      }
   }

No es necesario declarar el delegatepara llenar su tabla con datos.

Morgan Wilde
fuente