2010-07-01 3 views
11

UITableViewdelegatedata source을 구현하려고 시도하는 중 프레임 워크의 ABPeoplePickerNavigationController 클래스의 기능을 가능한 한 자세히 복제하지만 한 번에 여러 연락처를 선택하는 기능이 추가되었습니다 (/ 적절한 액세서리보기를 제거하여 해당 UITableViewCell). data source 방법으로 반환되어야로현재 로캘의 알파벳에있는 모든 문자 목록을 반환하는 코코아 메서드?

모두는 UITableView에 대한 (화면의 오른쪽에있는 스크롤 오버레이에 표시되는 문자) "섹션 지수 제목"지역화 제공하는 단계를 제외하고 잘 작동 :

분명히 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

, (난 그냥 NSArrayNSStrings A, B, C ... Z를 포함 반환 할 수 있지만 이상적으로이 방법처럼의 배열을 반환하는 것 해당되는 경우 대문자) 현재 로케일 알파벳의 글자.

한 약속 리드했다 :

[[NSLocalecurrentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]

그러나 나는 이것에 어떤 중요한 문서를 찾을 수 없습니다 그리고 내가 추출 할 수 없었습니다 어떤에서 NSCharacterSet을 반환 실제 캐릭터 (내가 할 수 있다면, NSCharacterSet의 capitalizedLetterCharacterSet 또한 유망한 출발점이 될 수있다).

I했습니다 또한 ABAddressBookRef가 I가 ... 지역화 알파벳의 CFArray 찾고 정확히 무엇을 얻기 위해 전달 될 수있는 기능 ABAddressBookCopySectionIndices()에 전화를 계시 AddressBookUI 프레임 워크에 otool -tV를 실행합니다. 그러나은 개인 기능이므로 앱에서 사용할 수 없습니다.

그래서 코코아 터치가이 기능을 지원하는지 여부를 아는 사람이 있습니까? 그리고 그렇지 않다면, ABAddressBookCopyIndices()이 어떻게 마법을 발휘하는지에 대한 아이디어가 있습니까? 나는 International Components for Unicode 라이브러리가 아니라 키를 누른 상태에서 의심,하지만 난 아니에요 그 능력을 잘 알고 (아직까지는) ...

+0

문자 집합을 기록하는 또 다른 방법 http : // stackoverflow.com/questions/3804270/how-to-print-characterset-in-objective-c – Robert

답변

15

섹션 색인이 "대문자"여야한다고 가정하지 마십시오. 일부 유럽 언어에만 유효합니다. 예 : 일본어 또는 중국어에는 대문자 개념이 없으며 시작 문자가 너무 많지만 실제 사전이나 실제 주소록에 일반적으로 사용되는 레이블이 있습니다.

대신 UILocalizedIndexedCollation 표준을 사용하십시오. 그것은 당신이 필요로하는 것을 정확하게 제공합니다.

+0

대단히 감사합니다. 나는 그 반을 더 일찍 찾지 못했다고 나는 믿을 수 없다. 나는 이것을 찾기 위해 많은 다른 구문을 봤지만, 필자는 필자가 필요로하는 것이 "데이터 정렬"이라고 생각한다. 저는 대문자가 여러 언어로 존재하지 않는다는 것을 알고 있습니다. 그래서 나는 원래의 글에서 대문자를 괄호 안에 넣었습니다. 나는 그것을 조금 더 명확하게하기 위해 그것을 편집했다. 다시 한번 감사드립니다. –

+1

당신은 완벽하게 환영합니다 :) 어떤 언어로든 멋지게 작동하는 앱을 만드십시오! – Yuji

+0

하지만 이제는 이렇게 걱정스러운 게시물을 찾았습니다. http://stackoverflow.com/questions/2909084/localized-index-for-uitableview 분명히 방법이 있지만 아직 제대로 구현되지 않았습니다. 이런. – Yuji

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

을 줄 것이다 세트 내의 문자의 배열

+0

동양인에게 자비를 베풀어 사용하지 마세요 : 사용 빈도가 매우 다른 수천 통의 편지 목록을 제공합니다 ; 100 번째 요소를 섹션 제목으로 사용하면 거의 사용되지 않는 문자 만 선택되며 완전히 쓸모가 없습니다. – Yuji

+0

나는 여기서 "사실"의 질문에 정말로 대답하지 않았다. 그러나 나는 그의 부질에 대답했다. 당신의 대답은 그가 필요로하는 것보다 훨씬 더 낫습니다. –

+0

대단히 감사합니다. Josh! 거기서 훌륭하게 일합니다. 나는 그것이 매우 유용한 기능을 일부 제공한다고 말했기 때문에 이것을지지했다. 그러나 주된 질문에 완벽하게 답하는 대신 Yuji의 대답을 받아들이지 않길 바란다. –