Ric*_*ock 11 iphone cocoa-touch objective-c abaddressbook
我目前正在尝试UITableView使用委托和数据源来实现,尽可能地复制ABAddressBookUI框架ABPeoplePickerNavigationController类的功能,但增加了一次选择多个联系人的能力(如添加/删除附件视图所示)到适当的UITableViewCell).
一切都运行正常,除了提供本地化的"部分索引标题"(屏幕右侧滚动覆盖中出现的字母)UITableView,因为应该由数据源方法返回:
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
显然,我可以返回一个NSArray包含NSStringsA,B,C ... Z的内容,但我理想地喜欢这个方法来返回当前语言环境字母表中所有(大写,适用的)字母的数组.
一个有希望的领导是:
[[NSLocalecurrentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]
但是我找不到任何关于这个的重要文档,它返回一个NSCharacterSet,我从中无法提取实际字符(如果我能做到这一点,那么NSCharacterSet capitalizedLetterCharacterSet也可能是一个很有希望的起点).
我也运行otool -tV在AddressBookUI框架,它透露给函数的调用ABAddressBookCopySectionIndices(),在其中一个ABAddressBookRef可以传递给获得正是我要找的...本地化字母的CFArray.但是,它是一个私有函数,所以我不能在我的应用程序中使用它.
那么,是否有人知道Cocoa Touch是否支持此功能?而且,如果没有,是否有任何关于如何ABAddressBookCopyIndices()发挥它的魔力的想法?我怀疑用于Unicode库的国际组件可能是关键所在,但我(目前尚未)熟悉它的功能......
Yuj*_*uji 15
请不要认为部分索引应该是"大写字母".这仅适用于某些欧洲语言.例如,日本人或中国人没有大写字母的概念,他们只是有太多的字母开头,但有一组习惯性的标签通常用于现实世界的词典或现实世界的地址簿.
而是使用标准的UILocalizedIndexedCollation.它完全满足您的需求.
感到无聊并为你写了这个
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);
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供集合中的字符数组.