5

Có cách nào để cập nhật các phần và hàng UITableView sau khi thay đổi fetchedResultsControllers NSpredicate (và thực hiện tìm nạp) không? Tôi muốn sử dụng phương thức ủy quyền controllerWillChangeContent để cập nhật bảng của tôi khi searchText trong searchBar của tôi bị thay đổi.Sử dụng NSFetchedResultsControllerDelegate để cập nhật các phần & hàng của TableView sau khi thay đổi NSPredicate

Hiện tại trong ứng dụng của tôi, các phương thức đại biểu này chỉ được gọi khi thay đổi trong coredata xảy ra. Không phải khi thay đổi vị từ resultsController & thực hiện tìm nạp.

Nếu tôi chỉ cần gọi [self.tableView reloadData] trên mỗi lần thay đổi văn bản, không có hoạt ảnh nào và nó sẽ chặn trải nghiệm một chút.

Hoặc tôi có nên làm điều gì đó hoàn toàn khác để cập nhật nội dung tableView trên mỗi thay đổi mục nhập văn bản tìm kiếm không?

Trả lời

7

Tôi đã có một cái nhìn vào tài liệu của Apple và nó trông giống như các phương pháp NSFetchedResultsControllerDelegate không được gọi khi một vị đã thay đổi:

Một thể hiện của NSFetchedResultsController sử dụng phương pháp trong Nghị định thư này để thông báo của nó ủy quyền rằng kết quả tìm nạp của bộ điều khiển đã được thay đổi do một số thêm, xóa, di chuyển hoặc cập nhật hoạt động .

Vì vậy, để trả lời câu hỏi của riêng tôi: Không thể sử dụng NSFetchedResultsControllerDelegate để cập nhật bảng sau khi thay đổi biến vị ngữ NSFetchedResultsController.

+0

Một cách tiếp cận khác có thể là cải cách vấn đề của bạn theo cách mà sự thay đổi của truy vấn thực sự là một sự thay đổi của dữ liệu. Tôi đã thử một số thứ với các thuộc tính đã tải và các mối quan hệ với một đối tượng "truy vấn" trung tâm được sử dụng trong vị từ, mà sau đó tôi sẽ thay đổi, nhưng Core Data không mua nó. Nó chỉ đánh giá lại bất cứ thứ gì nếu tôi tự cập nhật các thực thể. – mvds

+0

Thnx. Tôi sẽ xem xét điều đó. – P5ycH0

0

Cố gắng gọi [self.tableView reloadData] trong

-(void)viewWillAppear:(BOOL)animated; 
       or 
-(void)viewDidAppear:(BOOL)animated; 
+0

Điều này sẽ không khắc phục được sự cố của tôi vì chế độ xem đã có trên màn hình. – P5ycH0

0

Bạn có thể thử bằng cách sử dụng phương pháp UITableViewreloadSections:withRowAnimation: đi qua trong một NSIndexSet với tất cả các bộ phận của bạn. Bằng cách đó bạn nên có toàn bộ điều tải lại nhưng vẫn nhận được các hình ảnh động của sự lựa chọn của bạn.

Nếu bạn thêm và xóa các hàng, bạn sẽ cần sử dụng insertSections:withRowAnimation:removeSections:withRowAnimation:. Nếu bạn đang thực hiện một số thay đổi cùng một lúc, bạn cũng nên thực hiện chúng giữa các cuộc gọi đến beginUpdatesendUpdates.

+0

Chức năng tìm kiếm của tôi cũng thay đổi nr của các phần trong tableView. Nếu tôi sử dụng reloadSections tôi nhận được một lỗi như --- "Số lượng các phần chứa trong bảng xem sau khi cập nhật (1) phải bằng số lượng các phần có trong khung nhìn bảng trước khi cập nhật (61)" - - Làm thế nào tôi nên đối phó với điều đó? – P5ycH0

+0

Ngoài ra, Tại sao phương pháp NSFetchedResultsControllerDelegate 'didChangeSection' & 'didChangeObject' được gọi khi fetchedResultsController bị thay đổi bởi một yêu cầu tìm nạp NSPredicate & execute? Những phương thức này có các phương thức deleteSections & insertSections nên xử lý các thay đổi. – P5ycH0

+0

Tôi tin rằng các phương thức đại biểu chỉ được gọi là kết quả của sự thay đổi trong lớp mô hình (chẳng hạn như khi lưu: được gọi trên Ngữ cảnh đối tượng được quản lý). – extremeboredom

0

Từ NSFetchedResultsController Lớp tham khảo:

Sửa đổi Fetch Yêu cầu

Bạn có thể không chỉ đơn giản là thay đổi theo yêu cầu lấy để sửa đổi kết quả. Nếu bạn muốn thay đổi yêu cầu tìm nạp, bạn phải:

Nếu bạn đang sử dụng bộ nhớ cache, hãy xóa nó (sử dụng deleteCacheWithName :). Thông thường, bạn không nên sử dụng bộ nhớ cache nếu bạn đang thay đổi yêu cầu tìm nạp.

Thay đổi yêu cầu tìm nạp. Gọi performFetch :.

Vì bạn đã thay đổi vị từ, bạn phải gọi performFetch: một lần nữa và sau đó đại biểu sẽ xử lý cập nhật bảng từ đó.

+0

Thanx cho câu trả lời của bạn. Tìm kiếm của tôi hoạt động tốt. Tôi xóa bộ nhớ cache, đặt vị từ & thực hiện tìm nạp. Thật không may, tôi cần phải làm một tableView tải lại để xem kết quả. Bây giờ tôi đang tìm cách để chỉ cập nhật các phần và hàng đã loại bỏ/thêm vào trong tableView. NSFetchedResultsControllerDelegate cũng làm việc cho tôi khi tôi chèn dữ liệu vào dữ liệu lõi. Nhưng tôi bối rối là tại sao các phương thức đại biểu không kích hoạt khi tôi thực hiện một yêu cầu mới với một biến vị ngữ mới. – P5ycH0

+0

Điều này dường như không chính xác. Tôi phải tải lại dữ liệu sau khi thực hiện tìm nạp ngay cả với bộ nhớ cache nil. –

+0

@BobSpryn Bạn phải gửi '-reloadData' đến chế độ xem bảng nếu bạn không triển khai ủy nhiệm NSFRC. –

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