Come impostare il titolo della sezione UITableView a livello di programmazione (iPhone / iPad)?


106

Ho creato un UITableViewin Interface Builder usando storyboards. Il UITableViewè configurato con static cellse diverse sezioni.

Il problema che sto riscontrando è che sto cercando di configurare la mia app in diverse lingue. Per fare ciò devo essere in grado di modificare in UITableViewqualche modo i titoli delle sezioni.

Per favore qualcuno può aiutarmi? Idealmente mi piacerebbe affrontare il problema usando, IBOutletsma sospetto che in questo caso non sia nemmeno possibile. Qualche consiglio e suggerimento sarebbe davvero apprezzato.

Grazie in anticipo.

Risposte:


280

Dopo aver connesso il tuo UITableView delegatee il datasourcetuo controller, potresti fare qualcosa del genere:

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

veloce

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
}

Sei sicuro che venga effettivamente chiamato se imposti lo storyboard usando celle statiche? Non mi sembra che sia stato invocato.
pareggiato il

7
Ah, sembra che devi implementare numberOfSectionsInTableView:tableView:per farlo chiamare.
pareggiato il

Per le celle statiche, (la maggior parte) tutti gli altri metodi dell'origine dati non sono implementati.
wcochran

2
@drewish numberOfSectionsInTableView:tableView:implementato in IB per celle statiche.
wcochran

drewish ha ragione: se si implementa numberOfSectionsInTableView:, il metodo del titolo viene chiamato e sovrascrive lo storyboard. Poiché si tratta di una visualizzazione tabella statica, è abbastanza corretto sovrascriverla con un metodo che restituisce un numero costante @wcochran
GreatWiz

16

Se stai scrivendo codice in Swift, apparirebbe come un esempio come questo

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

Usa il metodo UITableViewDataSource

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

5

titleForHeaderInSection è un metodo delegato di UITableView quindi per applicare il testo dell'intestazione della sezione scrivi come segue,

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

3

Si noti che -(NSString *)tableView: titleForHeaderInSection:non viene chiamato da UITableView se - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionè implementato nel delegato di UITableView;


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

il testo dell'etichetta della sezione è impostato.

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

Niente di sbagliato nelle altre risposte, ma questa offre una soluzione non programmatica che può essere utile in situazioni in cui si ha una piccola tabella statica. Il vantaggio è che si possono organizzare le localizzazioni utilizzando lo storyboard. Si può continuare a esportare le localizzazioni da Xcode tramite file XLIFF. Xcode 9 ha anche diversi nuovi strumenti per semplificare le localizzazioni .

(originale)

Avevo un requisito simile. Avevo una tabella statica con celle statiche nel mio Main.storyboard (Base). Per localizzare i titoli delle sezioni utilizzando file .string ad esempio Main.strings (tedesco) basta selezionare la sezione nello storyboard e annotare l'ID oggetto

ID oggetto

Successivamente vai al tuo file di stringa, nel mio caso Main.strings (tedesco) e inserisci la traduzione come:

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

Risorse addizionali:


1

Non conosco le versioni precedenti dei UITableViewprotocolli, ma a partire da iOS 9 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?fa parte del UITableViewDataSourceprotocollo.

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

Non è necessario dichiarare delegateper riempire la tabella con i dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.