Cocoa方法返回当前语言环境字母表中所有字母的列表?

时间:2010-07-01 20:09:41

标签: iphone objective-c cocoa-touch abaddressbook

我目前正在尝试使用UITableViewdelegate来实现data source,尽可能地复制ABAddressBookUI框架{{3}的功能}},但增加了一次选择多个联系人的能力(如通过向相应的ABPeoplePickerNavigationController添加/删除附件视图所示)。

除了为UITableViewCell提供本地化的“部分索引标题”(显示在屏幕右侧滚动覆盖中的字母)之外,一切都运行良好,应该由{返回} {3}}方法:

  

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

显然,我可以返回一个包含UITableView A,B,C ... Z的data source,但我最好还是喜欢这个方法来返回所有的数组(大写(如适用)当前区域设置的字母

一个有希望的领导是:

  

[[ NSArray currentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]

但我找不到任何重要的文档,它会返回一个NSStrings,我无法从中提取实际字符(如果我能这样做,那么NSCharacterSet的NSLocale也可能是一个很有希望的起点。)

我还在NSCharacterSet框架上运行capitalizedLetterCharacterSet,该框架显示了对函数ABAddressBookCopySectionIndices()的调用,其中可以传递otool -tV以准确获取我正在寻找...本地化字母表的CFArray。 然而,它是一个私有函数,所以我不能在我的应用程序中使用它。

那么,是否有人知道Cocoa Touch是否支持此功能?而且,如果没有,是否有关于ABAddressBookCopyIndices()如何发挥其魔力的任何想法?我怀疑AddressBookUI库可能掌握了密钥,但我(目前)还不熟悉它的功能......

2 个答案:

答案 0 :(得分:15)

请不要认为部分索引应为“大写字母”。这仅适用于某些欧洲语言。例如。日本人或中国人没有大写字母的概念,他们只是开头有太多的字母,但是现实世界的字典或真实世界的地址簿中通常使用一组习惯性的标签。

相反,请使用标准UILocalizedIndexedCollation。它完全满足您的需求。

答案 1 :(得分:5)

感到无聊并为你写了

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

这会给你一组字符中的字符。