Wie kann ich den Titel des UITableView-Abschnitts programmgesteuert festlegen (iPhone / iPad)?

106

Ich habe einen UITableViewin Interface Builder mit erstellt storyboards. Das UITableViewist eingerichtet mit static cellsund eine Reihe von verschiedenen Abschnitten.

Das Problem ist, dass ich versuche, meine App in mehreren verschiedenen Sprachen einzurichten. Dazu muss ich in der Lage sein, die UITableViewAbschnittsüberschriften irgendwie zu ändern .

Kann mir bitte jemand helfen? Idealerweise möchte ich mich dem Problem mit nähern, IBOutletsaber ich vermute, dass dies in diesem Fall nicht einmal möglich ist. Jeder Rat und Anregungen wäre sehr dankbar.

Danke im Voraus.

Der verrückte Schimpanse
quelle

Antworten:

280

Sobald Sie Ihr UITableView delegateund datasourceIhren Controller verbunden haben, können Sie Folgendes tun:

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

Schnell

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
}
Alladinian
quelle
Sind Sie sicher, dass dies tatsächlich aufgerufen wird, wenn Sie das Storyboard mit statischen Zellen einrichten? Ich scheine nicht angerufen zu werden.
Zeichnen
7
Ah, es scheint, als müssten Sie implementieren numberOfSectionsInTableView:tableView:, um es aufzurufen.
Zeichnen
Bei statischen Zellen sind (die meisten) anderen Datenquellenmethoden nicht implementiert.
Wcochran
2
@drewish numberOfSectionsInTableView:tableView:in IB für statische Zellen implementiert.
Wcochran
drawish ist richtig - wenn Sie implementieren numberOfSectionsInTableView:, wird die title-Methode aufgerufen und das Storyboard überschrieben . Da dies eine statische Tabellenansicht ist, ist es ziemlich in Ordnung, sie mit einer Methode zu überschreiben, die eine konstante Zahl @wcochran
GreatWiz
16

Wenn Sie Code in Swift schreiben, sieht dies wie folgt aus

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
quelle
10

Verwenden Sie die UITableViewDataSource-Methode

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

titleForHeaderInSection ist eine Delegatmethode von UITableView , um den Headertext des Abschnittsschreibens wie folgt anzuwenden:

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

Beachten Sie, dass -(NSString *)tableView: titleForHeaderInSection:dies von UITableView nicht aufgerufen wird, wenn - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectiones im Delegaten von UITableView implementiert ist.

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

Abschnittsbeschriftungstext werden gesetzt.

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

An den anderen Antworten ist nichts auszusetzen, aber diese bietet eine nicht programmatische Lösung, die in Situationen nützlich sein kann, in denen eine kleine statische Tabelle vorhanden ist. Der Vorteil ist, dass man die Lokalisierungen über das Storyboard organisieren kann. Man kann weiterhin Lokalisierungen von Xcode über XLIFF-Dateien exportieren. Xcode 9 verfügt außerdem über mehrere neue Tools, die die Lokalisierung erleichtern.

(Original)

Ich hatte eine ähnliche Anforderung. Ich hatte eine statische Tabelle mit statischen Zellen in meinem Main.storyboard (Base). Um Abschnittstitel mithilfe von .string-Dateien zu lokalisieren, z. B. Main.strings (deutsch), wählen Sie einfach den Abschnitt im Storyboard aus und notieren Sie sich die Objekt-ID

Objekt Identifikation

Gehen Sie anschließend zu Ihrer String-Datei, in meinem Fall Main.strings (Deutsch), und fügen Sie die Übersetzung wie folgt ein:

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

Zusätzliche Ressourcen:

igoMobile
quelle
1

Ich weiß nichts über frühere Versionen von UITableViewProtokollen, aber ab iOS 9 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?ist dies Teil des UITableViewDataSourceProtokolls.

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

Sie müssen das nicht deklarieren delegate, um Ihre Tabelle mit Daten zu füllen.

Morgan Wilde
quelle