Jak programowo ustawić tytuł sekcji UITableView (iPhone / iPad)?

106

Stworzyłem UITableVieww Interface Builder używając storyboards. UITableViewJest konfiguracja z static cellsoraz szereg różnych sekcjach.

Problem polega na tym, że próbuję skonfigurować moją aplikację w kilku różnych językach. Aby to zrobić, muszę UITableViewjakoś zmienić tytuły sekcji.

Czy ktoś może mi pomóc? Idealnie chciałbym podejść do problemu używając, IBOutletsale podejrzewam, że w tym przypadku nie jest to nawet możliwe. Wszelkie rady i sugestie będą naprawdę mile widziane.

Z góry dziękuję.

Szalony szympans
źródło

Odpowiedzi:

280

Po podłączeniu UITableView delegatei datasourcekontrolera, możesz zrobić coś takiego:

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

Szybki

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
źródło
Czy na pewno zostanie to wywołane, jeśli skonfigurujesz tablicę scenariuszy za pomocą komórek statycznych? Nie wydaje mi się, żeby to było przywoływane.
drewish
7
Ach, wygląda na to, że musisz wdrożyć, numberOfSectionsInTableView:tableView:aby go wywołać .
drewish
W przypadku komórek statycznych (większość) wszystkie inne metody źródła danych nie są zaimplementowane.
wcochran
2
@drewish numberOfSectionsInTableView:tableView:zaimplementowano w IB dla komórek statycznych.
wcochran
drewish ma rację - jeśli zaimplementujesz numberOfSectionsInTableView:, wywoływana jest metoda tytułowa i nadpisuje scenorys. Ponieważ jest to statyczny widok tabeli, można go zastąpić metodą, która zwraca stałą liczbę @wcochran
GreatWiz
16

Jeśli piszesz kod w języku Swift, będzie to wyglądać jak ten przykład

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
źródło
10

Użyj metody UITableViewDataSource

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
geraldWilliam
źródło
5

titleForHeaderInSection jest metodą delegata UITableView, więc aby zastosować tekst nagłówka sekcji, napisz w następujący sposób,

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
              return @"Hello World";
}
iAnkit
źródło
3

Należy zauważyć, że -(NSString *)tableView: titleForHeaderInSection:nie jest wywoływana przez UITableView, jeśli - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionjest zaimplementowana w delegacie UITableView;

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

tekst etykiety sekcji jest ustawiony.

- (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
źródło
2

Nie ma nic złego w innych odpowiedziach, ale ta oferuje nieprogramistyczne rozwiązanie, które może być przydatne w sytuacjach, gdy mamy małą statyczną tabelę. Zaletą jest to, że można organizować lokalizacje za pomocą scenorysu. Można nadal eksportować lokalizacje z Xcode za pomocą plików XLIFF. Xcode 9 ma również kilka nowych narzędzi ułatwiających lokalizacje .

(oryginalny)

Miałem podobny wymóg. Miałem statyczną tabelę ze statycznymi komórkami w mojej Main.storyboard (Base). Aby zlokalizować tytuły sekcji za pomocą plików .string, np. Main.strings (niemiecki), po prostu wybierz sekcję w scenorysie i zanotuj identyfikator obiektu

ID obiektu

Następnie przejdź do pliku string, w moim przypadku Main.strings (niemiecki) i wstaw tłumaczenie takie jak:

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

Dodatkowe zasoby:

igoMobile
źródło
1

Nie wiem o poprzednich wersjach UITableViewprotokołów, ale od iOS 9 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?jest częścią UITableViewDataSourceprotokołu.

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

Nie musisz deklarować, delegateaby wypełnić tabelę danymi.

Morgan Wilde
źródło