Какао-метод для возврата списка всех букв в алфавите текущей локали? - PullRequest
11 голосов
/ 02 июля 2010

В настоящее время я пытаюсь реализовать UITableView с делегатом и источником данных , который максимально точно копирует функциональность, найденную ABAddressBookUI класс * Framework1 ABPeoplePickerNavigationController, но с добавленной возможностью выбирать несколько контактов одновременно (как указано добавлением / удалением дополнительного вида к соответствующему UITableViewCell).

Все работает нормально, за исключением предоставления локализованных «заголовков указателей разделов» (букв, которые появляются в оверлее прокрутки справа от экрана) для UITableView, как и должно быть возвращено источником данных метод:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

Очевидно, я мог бы просто вернуть NSArray, содержащий NSStrings A, B, C ... Z, но в идеале я хотел бы, чтобы этот метод возвращал массив всех (заглавных, где это применимо) букв алфавита текущей локали .

Одно многообещающее преимущество было:

[[NSLocalecurrentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]

Но я не могу найти какой-либо существенной документации по этому вопросу, и он возвращает NSCharacterSet, из которого я не смог извлечь фактические символы (если бы я мог это сделать, тогда NSCharacterSet's capitalizedLetterCharacterSet также может быть многообещающей отправной точкой).

Я также запустил otool -tV на платформе AddressBookUI, которая обнаружила вызов функции ABAddressBookCopySectionIndices(), в которую ABAddressBookRef можно передать, чтобы получить именно то, что я ищу ... CFArray локализованного алфавита. Однако , это частная функция, поэтому я не могу использовать ее в своем приложении.

Итак, кто-нибудь знает, поддерживает ли Cocoa Touch эту функцию? И, если нет, есть какие-нибудь идеи относительно того, как ABAddressBookCopyIndices() работает своим волшебством? Я подозреваю, что библиотека International Components for Unicode вполне может удерживать ключ, но я (пока) не знаком с ее возможностями ...

Ответы [ 2 ]

15 голосов
/ 02 июля 2010

Пожалуйста, не думайте, что индексы раздела должны быть "заглавными буквами". Это действительно только для некоторых европейских языков. Например. Японцы или китайцы не имеют понятия заглавных букв, у них просто слишком много букв для начала, но есть обычный набор меток, обычно используемых в реальных словарях или реальных адресных книгах.

Вместо этого используйте стандарт UILocalizedIndexedCollation . Это дает именно то, что вам нужно.

5 голосов
/ 02 июля 2010

Надоело и написал это для вас

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

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

...