Як встановити назву розділу UITableView програмно (iPhone / iPad)?


106

Я створив UITableViewІнтерфейс Builder за допомогою storyboards. UITableViewЄ установка з static cellsі цілим рядом різних розділів.

Проблема у мене полягає в тому, що я намагаюся налаштувати додаток на декілька різних мов. Для цього мені потрібно мати можливість UITableViewякось змінити заголовки розділів.

Будь ласка, хтось може мені допомогти? В ідеалі я хотів би підійти до проблеми, використовуючи, IBOutletsпроте, я підозрюю, що це навіть неможливо в цьому випадку. Будь-які поради та пропозиції були б дуже вдячні.

Заздалегідь спасибі.

Відповіді:


280

Після підключення UITableView delegateі datasourceконтролера ви можете зробити щось подібне:

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

Швидкий

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
}

Ви впевнені, що насправді дзвонить, якщо встановити дошку історії за допомогою статичних комірок? Мені не здається, що на нього викликають.
велетенський

7
А, здається, вам потрібно реалізувати, numberOfSectionsInTableView:tableView:щоб викликати це.
велетенський

Для статичних комірок (більшість) всі інші методи джерела даних не реалізовані.
wcochran

2
@drewish numberOfSectionsInTableView:tableView:реалізований в ІБ для статичних комірок.
wcochran

drewish це правильно - якщо ви реалізуєте numberOfSectionsInTableView:, тоді називається метод заголовка і перекриває розгорнуту дошку. Оскільки це статичний перегляд таблиці, то цілком нормально його замінити методом, який повертає постійне число @wcochran
GreatWiz

16

Якщо ви пишете код у Swift, це виглядатиме як такий приклад

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

Використовуйте метод UITableViewDataSource

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

5

titleForHeaderInSection - метод делегування UITableView, щоб застосувати текст заголовка розділу писати так,

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

3

Зверніть увагу, що -(NSString *)tableView: titleForHeaderInSection:UITableView не викликається, якщо - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)sectionвін реалізований у делегатах UITableView;


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

Встановлено текст мітки розділу.

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

З іншими відповідями нічого поганого, але цей пропонує непрограмне рішення, яке може бути корисним у ситуаціях, коли є невелика статична таблиця. Перевага полягає в тому, що можна організувати локалізації за допомогою розкадрівки. Можна продовжувати експортувати локалізації з Xcode через файли XLIFF. Xcode 9 також має кілька нових інструментів для спрощення локалізації .

(оригінал)

У мене була схожа вимога. Я мав статичну таблицю зі статичними осередками в моєму Main.storyboard (Base). Щоб локалізувати заголовки розділів за допомогою .string-файлів, наприклад, Main.strings (німецькою мовою), просто виберіть розділ у дошці розкадрування та зазначте ідентифікатор об'єкта

Ідентифікатор об’єкта

Після цього перейдіть до вашого рядкового файлу, у моєму випадку Main.strings (німецька) та вставте переклад на зразок:

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

Додаткові ресурси:


1

Я не знаю про минулі версії UITableViewпротоколів, але станом на iOS 9 func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?є частиною UITableViewDataSourceпротоколу.

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

Вам не потрібно декларувати, delegateщоб заповнити таблицю даними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.