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

106

Я создал UITableViewв Interface 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;
}

Swift

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:реализован в IB для статических ячеек.
wcochran
drewish прав - если реализовать numberOfSectionsInTableView:, то вызывается метод title и перекрывает раскадровку. Поскольку это статическое табличное представление, вполне нормально переопределить его с помощью метода, который возвращает постоянное число @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"
    }
}
BCI
источник
10

Используйте метод UITableViewDataSource

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
Джеральд Уильям
источник
5

titleForHeaderInSection - это метод делегата UITableView, поэтому, чтобы применить текст заголовка раздела, напишите следующее:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
              return @"Hello World";
}
iAnkit
источник
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 (немецкий), просто выберите раздел в раскадровке и обратите внимание на идентификатор объекта.

ID объекта

После этого перейдите в свой строковый файл, в моем случае Main.strings (немецкий), и вставьте перевод, например:

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

Дополнительные ресурсы:

igoMobile
источник
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чтобы заполнить таблицу данными.

Морган Уайлд
источник