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

Это даст вам массив символов в наборе.