Các tài liệu cho NSFetchedResultsControllerDelegate cung cấp mẫu mã sau đâyHành vi NSFetchedResultsControllerDelegate 'ChangeUpdate' có bị hỏng không?
- (void)controller:(NSFetchedResultsController *)controller
didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath
forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
Khi tôi tạo ra một NSManagedObject mới, NSFetchedResultsChangeInsert cháy (tuyệt vời!). Khi tôi thay đổi giá trị của một thuộc tính (được sử dụng cho tiêu đề của ô), các vụ cháy NSFetchedResultsChangeUpdate. Thật không may, tiêu đề mới không tự động hiển thị trừ khi tôi tải lại bảng, phần hoặc hàng. Thật vậy, nếu tên mới khiến cho tập kết quả sắp xếp khác nhau, thì NSFetchedResultsChangeMove cháy và tất cả là tốt kể từ khi mã được cung cấp tải lại toàn bộ phần.
UITableView có một phương pháp reloadRowsAtIndexPaths: withRowAnimation vì vậy tôi cố gắng sử dụng này theo những NSFetchedResultsChangeUpdate khối mã. Nó thực sự làm việc ... nhưng tài liệu cho phương pháp cụ thể này đọc như thể tôi không cần nó (chú ý dòng cuối cùng):
Reloading một hàng gây ra quan điểm bảng để hỏi nguồn dữ liệu của nó cho một ô mới cho hàng đó. Bảng hoạt ảnh mà ô mới trong đó làm hoạt hình hàng cũ. Gọi phương thức này nếu bạn muốn thông báo cho người dùng rằng giá trị của ô đang thay đổi. Tuy nhiên, nếu thông báo cho người dùng không phải là quan trọng - tức là bạn chỉ muốn thay đổi giá trị mà ô là hiển thị — bạn có thể nhận được một hàng cụ thể và đặt giá trị mới.
Và vâng, nếu tôi đăng nhập gì đang xảy ra, khi
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
được gọi trên một NSFetchedResultsChangeUpdate, nó có thể lấy lại 'tên' giá trị mới nhất và đặt nó trong textLabel của tế bào . Tên không chỉ hiển thị trong ô trừ khi tôi tải lại. Ngay cả khi tôi chỉ cần nhấp vào ô mà tên hiển thị. Lưu ý rằng để tạo lại hành vi này, bạn phải tạo một đối tượng được quản lý mới và sau đó đặt cho nó một tên khiến nó sắp xếp FIRST trong NSFetchedResultsController. Bằng cách đó, NSFetchedResultsChangeMove không kích hoạt (hoạt động vì nó tải lại phần này).
Tôi có thiếu điều gì đó hoặc hành vi mong đợi này không? 'Thảo luận' cho reloadRowsAtIndexPaths dẫn tôi tin rằng tôi có thể chỉ cần đặt textLabel của ô mà không cần tải lại hàng, phần hoặc bảng.
Điều này cần được làm rking. Tôi đang làm điều tương tự. Đối với các thay đổi đối với các thuộc tính, khi lưu: được gọi, thông báo MOC sẽ xuất hiện. NSFetchedResultsController thấy sự thay đổi và gọi phương thức configureCell: atIndexPath của tôi. Ở đó tôi lấy các giá trị và điền vào ô, và ô được cập nhật ngay lập tức. Đăng mã configureCell của bạn. –