2010-07-01 7 views
11

Ich versuche derzeit, eine UITableView mit einer delegate und data source zu implementieren, die so genau wie möglich die Funktionalität der ABAddressBookUI Klasse ABPeoplePickerNavigationController Klasse Framework repliziert, aber mit der zusätzlichen Fähigkeit, mehrere Kontakte auf einmal auswählen (wie durch Hinzufügen/Entfernen einer Zubehöransicht zum entsprechenden UITableViewCell). „Abschnittsindex Titel“ lokalisiert (die Buchstaben, die auf der rechten Seite des Bildschirms in der Scroll-Overlay angezeigt) für die UITableViewCocoa-Methode zum Zurückgeben einer Liste aller Buchstaben im aktuellen Gebietsschema-Alphabet?

Alles funktioniert gut, mit Ausnahme des Vorsehens als sollten von der data source Verfahren zurückgeführt werden:

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

Offensichtlich konnte ich wieder nur ein NSArray mit dem NSStrings A, B, C ... Z, aber ich mag diese Methode ideal würde eine Reihe von all das zurückzukehren (ggf. Großbuchstaben) Buchstaben des Alphabets des aktuellen Gebiets.

Eine vielversprechende Führung war:

[[NSLocalecurrentLocale ] objectForKey:@"NSLocaleExemplarCharacterSet" ]

Aber ich kann keine nennenswerte Dokumentation zu diesem Thema finden und es gibt ein NSCharacterSet, aus dem ich nicht in der Lage gewesen bin zu extrahieren die tatsächlichen Zeichen (wenn ich das könnte, dann könnte NSCharacterSet capitalizedLetterCharacterSet auch ein vielversprechender Ausgangspunkt sein).

Ich habe auch eine otool -tV auf dem AddressBookUI Rahmen laufen, die einen Aufruf der Funktion ABAddressBookCopySectionIndices() ergab, in die ein ABAddressBookRef übergeben werden kann, genau zu erhalten, was ich suche ... ein CFArray des lokalisierten Alphabets. Allerdings, es ist eine private Funktion, so kann ich es nicht in meiner App verwenden.

Weiß jemand also, ob Cocoa Touch diese Funktionalität unterstützt? Und wenn nicht, gibt es irgendwelche Ideen, wie ABAddressBookCopyIndices() seine Magie funktioniert? Ich vermute, die International Components for Unicode Bibliothek auch den Schlüssel halten kann, aber ich bin nicht (noch) vertraut mit seinen Fähigkeiten ...

+0

Eine weitere Möglichkeit zum Protokollieren eines Zeichensatzes http: // stackoverflow.com/questions/3804270/how-to-print-Zeichensatz-in-objective-c – Robert

Antwort

15

Bitte gehen Sie nicht davon aus, dass die Abschnittsindizes "Großbuchstaben" sein sollten. Das gilt nur für einige europäische Sprachen. Z.B. Japanisch oder Chinesisch haben nicht das Konzept der Großbuchstaben, sie haben einfach zu viele Buchstaben, aber es gibt einen üblichen Satz von Etiketten, die normalerweise in realen Wörterbüchern oder realen Adressbüchern verwendet werden.

Verwenden Sie stattdessen den Standard UILocalizedIndexedCollation. Es gibt genau das, was Sie brauchen.

+0

Vielen Dank, Yuji! Ich kann nicht glauben, dass ich diese Klasse früher nicht gefunden habe. Ich habe so viele verschiedene Sätze gegoogelt, um zu versuchen, das zu finden, aber ich denke, "Kollatierung" war die, die ich brauchte. Mir ist bewusst, dass Großbuchstaben in mehreren Sprachen nicht existieren, weshalb ich Großbuchstaben in Klammern in den Originalbeitrag gesetzt habe. Ich habe es jetzt überarbeitet, um das etwas klarer zu machen. Danke noch einmal. –

+1

Sie sind herzlich willkommen :) Bitte machen Sie eine App, die gut in jeder Sprache funktioniert! – Yuji

+0

Aber jetzt habe ich diesen beunruhigenden Beitrag in SO gefunden: http://StackOverflow.com/Questions/2909084/localized-Index-ForUnstigeAnsicht Offenbar ist die Methode da, wurde aber noch nicht richtig implementiert. Meine Güte. – Yuji

5

langweilig wurde und dies für Sie

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

schrieb aufrichten, das Sie geben ein Array der Zeichen in der Menge.

+0

Bitte haben Sie mit Ostasiaten Gnade und nutzen Sie nicht: p Es wird eine Liste von Tausenden von Buchstaben, mit sehr unterschiedlichen Nutzungsfrequenzen geben ; Wenn Sie jedes 100. Element als Abschnittstitel verwenden, werden nur sehr selten verwendete Zeichen ausgewählt und das ist völlig nutzlos. – Yuji

+0

Ich habe die "wahre" Frage hier nicht wirklich beantwortet. Aber ich beantwortete seine Teilfrage. Ihre Antwort ist definitiv mehr auf das, was er braucht. –

+0

Vielen Dank, Josh! Ausgezeichnete Arbeit dort. Ich habe das aufgestockt, weil ich sagen würde, dass es einige äußerst nützliche Funktionen bietet, aber ich hoffe, es macht Ihnen nichts aus, dass ich stattdessen Yujis Antwort akzeptiere, da es die Hauptfrage perfekt beantwortet. –