Как работает `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:
когда вы используете сопоставление. Для конкретного локализованного сопоставления между заголовками разделов и разделами может быть однозначное соответствие, а может и нет; но вы не знаете, и вам все равно. Просто сделайте то, что говорит вам шаблон из документации, и все будет в порядке.