Как работает `sectionForSectionIndexTitleAtIndex` в UILocalizedIndexCollation? (Esp с пользовательскими заголовками разделов) Всегда возвращает одно и то же число

Это отличается в разных регионах? Я совершенно не понимаю, в чем смысл sectionForSectionIndexTitleAtIndex метод на UILocalizedIndexCollation является. Каждый индекс, который я передаю, просто возвращает идентичный индекс.

Документация не очень полезна, и я не могу найти ни одного случая, когда число, которое она возвращает, отличается от числа, которое я предоставляю. Почему бы просто не вернуть сам номер?

Хуже того, если я добавлю дополнительные индексы в мое табличное представление, такие как UITableViewIndexSearch и некоторые пользовательские, так что в общей сложности заголовки индекса раздела моего табличного представления имеют символ поиска, две пользовательских буквы, буквы алфавита и # (всего 30 заголовков раздела), я понятия не имею, что передать в sectionForSectionIndexTitleAtIndex от UITableViewDataSource"s sectionForSectionIndexTitle:atIndex: метод!

Если я передам индекс, который мне дает метод табличного представления (скажем, 1), он вернет мне 1, что неверно, потому что, если я коснусь индекса 1 раздела, он должен перейти к первому пользовательскому. Поэтому я должен начинать только после того, как начинается алфавитная часть, которая начинается с индекса 3. Но если я передам 3 в sectionForSectionIndexTitleAtIndex метод, я получаю 3 назад, когда я должен получить 2 назад, потому что символ поиска не является реальным разделом.

Поэтому я должен начинать только после 3, после чего я вычитаю 1, чтобы получить фактический индекс. Хорошо. Затем я перехожу к последнему разделу index, #, index 29. Я передаю 29 - 1 (что 28) sectionForSectionIndexTitleAtIndex и тогда я получаю ошибку, что это выходит за пределы, потому что есть только 27 символов.

Как же я должен использовать это в этом случае? Это кажется совершенно бесполезным, и я чувствую, что просто возвращаю индекс. Но разве это ломается под определенными локалями? Как работает этот метод?

1 ответ

Решение

Давайте сделаем шаг назад и поговорим о методе источника данных табличного представления tableView:sectionForSectionIndexTitle:atIndex:,

Цель tableView:sectionForSectionIndexTitle:atIndex: как правило, когда вы создаете разделы и заголовки разделов (для индекса) вручную, и вы собираетесь отображать меньше заголовков разделов в индексе, чем фактически есть разделы.

Другое использование - это когда вы создаете заголовки разделов и разделов вручную и добавляете дополнительные заголовки разделов в указатель. Например, общее соглашение состоит в том, чтобы сделать первый элемент указателя увеличительным стеклом, к которому пользователь может прикоснуться, чтобы увидеть поле поиска в верхней части представления таблицы (его заголовок). Вот реализация, которая заботится об этой ситуации:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    if (index == 0)
        [tableView scrollRectToVisible:tableView.tableHeaderView.frame
                              animated:NO];
    return index-1;
}

(Если индекс равен нулю, мы в конечном итоге возвращаем -1, что не является реальным показателем, но и не причиняет вреда.)

С UILocalizedIndexCollation вы не создаете разделы и заголовки разделов вручную, а сортировка. Вы передаете контроль над ним. Вы не знаете, будет ли количество заголовков разделов совпадать с количеством разделов. Таким образом, вы должны обеспечить реализацию tableView:sectionForSectionIndexTitle:atIndex:, так, на всякий случай. Итак, вы реализуете tableView:sectionForSectionIndexTitle:atIndex: спрашивая сопоставление для его sectionForSectionIndexTitleAtIndex, как показано в документации:

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
}

Так что ответ на ваш вопрос "в чем смысл sectionForSectionIndexTitleAtIndex Метод на UILocalizedIndexCollation является ", есть: это так, что вы можете реализовать tableView:sectionForSectionIndexTitle:atIndex: когда вы используете сопоставление. Для конкретного локализованного сопоставления между заголовками разделов и разделами может быть однозначное соответствие, а может и нет; но вы не знаете, и вам все равно. Просто сделайте то, что говорит вам шаблон из документации, и все будет в порядке.

Другие вопросы по тегам