8

Tôi đang cố gắng triển khai UITableView được hỗ trợ bởi Core Data hỗ trợ lập chỉ mục (ví dụ: các ký tự xuất hiện bên cạnh và tiêu đề mục đi kèm với chúng). Tôi hoàn toàn không gặp vấn đề khi triển khai tính năng này mà không có Dữ liệu cốt lõi sử dụng:Dữ liệu chính được hỗ trợ UITableView với chỉ mục

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

Tôi cũng không gặp vấn đề gì khi triển khai UITableView được hỗ trợ bởi chỉ mục.

Điều tôi đang cố gắng tìm ra là làm thế nào để kết hợp hai cách thanh lịch? Rõ ràng khi bạn lập chỉ mục và tái phân đoạn nội dung, bạn không còn có thể sử dụng NSFetchedResultsController tiêu chuẩn để truy xuất những thứ tại một đường dẫn chỉ mục đã cho. Vì vậy, tôi đang lưu trữ các chữ cái chỉ mục của tôi trong một NSArray và nội dung được lập chỉ mục của tôi trong một NSDictionary. Điều này tất cả hoạt động tốt để trưng bày, nhưng tôi có một số cơn đau đầu thực sự khi nói đến việc thêm và xóa hàng, đặc biệt là làm thế nào để thực hiện tốt các phương pháp:

- (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; 

Bởi vì những con đường chỉ số nó trở về tôi không có mối tương quan với những người trong dữ liệu cốt lõi. Tôi nhận được thêm làm việc bằng cách xây dựng lại chỉ mục của tôi NSArray và NSDictionary khi người dùng thêm một hàng, nhưng làm như vậy khi họ xóa một tai nạn toàn bộ ứng dụng.

Có mẫu/ví dụ đơn giản nào tôi thiếu ở đây để làm cho tất cả hoạt động này hoạt động đúng không?

Chỉnh sửa: Chỉ cần làm rõ Tôi biết rằng NSFetchedResultsController thực hiện việc này, nhưng điều tôi muốn là sao chép chức năng như ứng dụng Danh bạ, trong đó chỉ mục là chữ cái đầu tiên của tên đầu tiên của người đó.

Trả lời

20

Bạn nên sử dụng CoreData NSFetchedResultsController để nhận các phần/chỉ mục của mình.
Bạn có thể chỉ định phím phần trong yêu cầu lấy (tôi nghĩ nó phải phù hợp với chính loại đầu tiên):

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; 

Sau đó, bạn có thể nhận được các tên phần như thế này:

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

và các chỉ số phần đang ở đây:

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

Thay đổi nội dung chỉ chỉ ra rằng bàn cần được cập nhật:

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

CẬP NHẬT
này chỉ làm việc cho các chỉ số và chỉ số di chuyển nhanh, không cho tiêu đề mục.
Xem this answer để "Cách sử dụng ký tự đầu tiên làm tên phần" để biết thêm thông tin và chi tiết về cách triển khai chữ cái đầu tiên cho tiêu đề phần cũng như chỉ mục.

+0

Tôi nghĩ rằng tôi đã không làm cho bản thân mình đủ rõ ràng. Tôi muốn các chỉ mục của tôi giống như ứng dụng Liên hệ, chữ cái đầu tiên của tên người đầu tiên. – rustyshelf

+0

Vì vậy, tại sao không sử dụng tên đầu tiên khi sectionNameKeyPath hoạt động? – gerry3

+0

sectionNameKeyPath! ??!?! ??! Làm thế nào tôi đã bỏ lỡ điều đó! Wow hoạt động rực rỡ. Tôi nên đọc doco tốt hơn trước khi mã hóa của riêng tôi ... đã trở lại với nó và nó làm việc một cách ngọt ngào. Tôi sẽ cung cấp cho bạn +5000 nếu tôi có thể;) – rustyshelf

Các vấn đề liên quan