Cocoa метод для возврата списка всех букв в текущем алфавите локали?
В настоящее время я пытаюсь реализовать UITableView
с delegate и источник данных, который как можно точнее повторяет найденную функциональность ABAddressBookUI
framework ABPeoplePickerNavigationController
, но с добавленной возможностью выбора нескольких контактов одновременно ( как указано добавлением/удалением дополнительного вида на соответствующий UITableViewCell
).
Все работает нормально, за исключением предоставления локализованных "заголовков индексов раздела" (буквы, которые появляются в наброске прокрутки справа от экрана) для UITableView
, как должен быть возвращен методом источник данных:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
Очевидно, я мог бы просто вернуть NSArray
, содержащий NSStrings
A, B, C... Z, но в идеале мне бы хотелось, чтобы этот метод возвращал массив всех (в верхнем регистре, где применимо) букв алфавита текущей локали.
Одним из перспективных направлений было:
[[
NSLocale
currentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]
Но я не могу найти существенную документацию по этому вопросу, и он возвращает NSCharacterSet
, из которого я не смог извлечь фактические символы (если бы я мог это сделать, то NSCharacterSet capitalizedLetterCharacterSet
также может стать многообещающей отправной точкой).
Я также запускал otool -tV
на AddressBookUI
, в котором был обнаружен вызов функции ABAddressBookCopySectionIndices()
, в которую можно передать ABAddressBookRef
, чтобы получить именно то, что Я ищу... CFArray локализованного алфавита. Однако это частная функция, поэтому я не могу использовать ее в своем приложении.
Итак, кто-нибудь знает, поддерживает ли Cocoa Touch эту функцию? И, если нет, есть ли какие-либо идеи относительно того, как ABAddressBookCopyIndices()
работает над своей магией? Я подозреваю, что библиотека International Components for Unicode может содержать ключ, но я пока еще не знаю его возможностей...
Ответы
Ответ 1
Пожалуйста, не предполагайте, что индексы раздела должны быть "заглавными буквами". Это справедливо только для некоторых европейских языков. Например. У японцев или китайцев нет понятия прописных букв, у них просто слишком много писем, но есть обычный набор ярлыков, обычно используемых в реальных словарях или реальных адресных книгах.
Вместо этого используйте стандартный UILocalizedIndexedCollation. Он дает именно то, что вам нужно.
Ответ 2
Скучно и написано для вас
NSArray * charactersInCharacterSet(NSCharacterSet *charSet)
{
NSMutableArray * array = [NSMutableArray array];
NSData * data = [charSet bitmapRepresentation];
const char* bytes = [data bytes];
for (int i = 0; i < 8192; ++i)
{
if (bytes[i >> 3] & (((unsigned int)1) << (i & 7)))
{
[array addObject:[NSString stringWithFormat:@"%C", i]];
}
}
return [NSArray arrayWithArray:array];
}
NSCharacterSet * charSet = [[[[NSLocale alloc] initWithLocaleIdentifier:@"sr_Cyrl_ME"] autorelease] objectForKey:NSLocaleExemplarCharacterSet];
NSArray * chars = charactersInCharacterSet(charSet);
for (NSString *str in chars)
{
NSLog(@"%@", str);
}
Это даст вам массив символов в наборе.