8

İndekslemeyi destekleyen bir Core Data destekli UITableView'ı (örneğin: yanlarda görünen karakterler ve onlarla birlikte gelen bölüm başlıkları) uygulamaya çalışıyorum. Bütün kullanarak Çekirdek veri olmadan bu uygulamaya hiçbir problem:Çekirdek Veriler, endeksleme ile UITableView destekli

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 

Ben de indeksleme kullanmadan Çekirdek Data tarafından desteklenmektedir bir UITableView uygulayan bir sorunum yok.

Anlamaya çalıştığım şey, ikisini birleştirmenin nasıl zarif bir şekilde birleştirileceğidir. Açıkça, içeriği indeksleyip yeniden bölümlendirdiğinizde, belirli bir dizin yolundaki şeyleri almak için artık standart NSFetchedResultsController'ı kullanamazsınız. Bu yüzden bir NSArray dizinindeki indeks harfleri ve dizinlenmiş içeriğimi bir NSDictionary içinde saklıyorum. Bu, tüm ekran için çalışıyor, ancak özellikle düzgün bu yöntemler nasıl uygulanacağını, satır ekleme ve silme geldiğinde bazı gerçek baş ağrısı vardır: bu beni döndürüyor endeks yolları Çünkü

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller; 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath; 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type; 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller; 

olanlarla hiçbir korelasyona sahip çekirdek verilerde. Kullanıcı bir satır eklediğinde sadece NSArray ve NSDictionary dizinimi yeniden oluşturarak çalışmayı ekledim, ancak silindiğinde aynı şeyi yapmak tüm uygulamayı çöker.

Basit bir örnek var mı/örnek Tüm bu işlerin düzgün bir şekilde yapılabilmesi için burada özlüyorum.

Düzenleme: Sadece açıklığa kavuşturun NSFetchedResultsController uygulamasının bunu kutudan çıkardığını biliyorum, ancak istediğim, Kişiler uygulaması gibi işlevin çoğaltılmasıdır; burada dizin, kişinin ilk adının ilk harfidir.

cevap

20

Bölüm/dizinlerinizi almak için CoreData NSFetchedResultsController aracınızı kullanmalısınız. Böyle bölüm adları alabilirsiniz Ardından

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
initWithKey:@"name" // this key defines the sort 
ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext 
sectionNameKeyPath:@"name" // this key defines the sections 
cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 

:
işlemlerini getirme isteğinde bölüm anahtarını belirtebilirsiniz (Ben ilk sıralama anahtarı maç için olduğunu düşünüyorum)

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo name]; 
} 

ve bölüm endeksleri Buradasınız:

içeriğe
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; 
[sectionInfo indexTitle]; // this is the index 

değişiklikler sadece tablo güncellenmesi gerekiyor göstermektedir:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView reloadData]; 
} 

GÜNCELLEME
değil bölüm başlıkları için indeksi ve hızlı indeks kaydırma, Bu sadece çalışır.
this answer adresine bakın ve bölüm başlıkları ile dizinin ilk harflerinin nasıl uygulanacağı hakkında daha fazla bilgi ve detaylar için "İlk karakteri bölüm adı olarak nasıl kullanılır" bölümüne bakın.

+0

Sanırım kendimi yeterince açıklamamıştım. İndekslerimin Kişiler uygulaması gibi olmasını, kişilerin adının ilk harfini istiyorum. – rustyshelf

+0

Peki, neden firstNameKeyPath olarak ilk adı kullanmıyor? – gerry3

+0

sectionNameKeyPath! ??!?! ??! Bunu nasıl özledim? Vay, bu harika çalışıyor. Doco'yu kendi kodumu yazmadan önce daha iyi okumalıydım ... buna geri döndü ve tatlı bir şekilde çalışıyor. Yapabilseydim sana +5000 verirdim;) – rustyshelf