11

我目前正在尝试使用委托和数据源来实现UITableView,该委托数据源尽可能地复制找到ABAddressBookUI框架ABPeoplePickerNavigationController类的功能,但增加了一次选择多个联系人的能力(如添加/删除附件视图所示)到适当的UITableViewCell)。

一切正常,除了为 提供本地化的“节索引标题”(出现在屏幕右侧的滚动覆盖中的字母)UITableView,应该由数据源方法返回:

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

显然,我可以只返回一个NSArray包含A、B、C ...Z 的值,但理想情况下,我希望这个方法返回一个包含当前 localeNSStrings的所有(大写,如果适用)字母的数组。

一个有希望的领先优势是:

[[NSLocalecurrentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]

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

我还在框架上运行了 an ,它显示了对 function 的调用otool -tV,可以将an传递到其中以获得我正在寻找的内容……本地化字母表的 CFArray。但是,它是一个私有函数,所以我不能在我的应用程序中使用它。AddressBookUIABAddressBookCopySectionIndices()ABAddressBookRef

那么,有人知道 Cocoa Touch 是否支持这个功能吗?而且,如果没有,是否有任何关于如何ABAddressBookCopyIndices()发挥其魔力的想法?我怀疑Unicode 库的国际组件很可能是关键,但我(目前)还不熟悉它的功能......

4

2 回答 2

16

请不要假设部分索引应该是“大写字母”。这仅对某些欧洲语言有效。例如,日语或中文没有大写字母的概念,它们只是有太多的字母开头,但是有一组习惯性的标签,通常用于现实世界的字典或现实世界的地址簿。

相反,请使用标准UILocalizedIndexedCollat​​ion。它提供了你所需要的。

于 2010-07-01T20:52:06.043 回答
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);
}

这将为您提供集合中的字符数组。

于 2010-07-01T20:47:34.883 回答