2017-10-27 29 views
5

Tôi đang sử dụng NSFetchedResultsController để nhóm theo mục trong đó sectionNameKeyPath là theo Danh mục.Thay đổi thứ tự sắp xếp bất kể sectionNameKeyPath trong NSFetchedResultsController

Danh mục của tôi là: Người lớn, Trẻ em, Tầm nhìn, Không có.

xếp tăng dần loại: Adult, trẻ em, Không, Vision

Giảm dần thứ tự sắp xếp: Vision, Không, trẻ em, người lớn

Tôi muốn Không loại đến cuối cùng luôn luôn bất kể thứ tự sắp xếp.

Tăng dần mong muốn loại: loại dành cho người lớn, trẻ em, Vision, Không

Giảm dần mong muốn: Vision, trẻ em, người lớn, Không

Mã sử ​​dụng như sau:

let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedOC, sectionNameKeyPath: "category", cacheName: nil) 

Trả lời

0

Tôi nghĩ rằng kể từ bạn đang lưu trữ danh mục dưới dạng giá trị Chuỗi và Chuỗi chỉ có thể sắp xếp theo thứ tự Bảng chữ cái. Có thể nếu bạn có thể tạo một trường số trong cơ sở dữ liệu không? Và lưu trữ giá trị số như Adult = 1, Child = 2, Vision = 3, None = 4, Thông qua bạn có thể dễ dàng sắp xếp và sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần. Hy vọng điều này sẽ giúp bạn.

+0

Nhưng trong trường hợp thứ tự giảm dần, NONE phải là mục cuối cùng. – Soumen

+0

Bạn có thể làm như lần đầu tiên tìm nạp dữ liệu "Adult = 1, Child = 2, Vision = 3" trong thứ tự sắp xếp và lưu trữ trong danh sách # 1. Và tiếp theo chỉ tìm nạp mục cho "Không" và lưu trữ trong danh sách # 2, cuối cùng hợp nhất cả hai danh sách. – Waseem

0

Nếu bạn vui mừng sửa đổi mô hình CoreData, bạn có thể tạo một thực thể mới để thể hiện các danh mục. Thực thể Category sẽ có ba thuộc tính: name (chuỗi), ascOrder (Số nguyên 16) và descOrder (Số nguyên 16). Sau đó (như là một nhiệm vụ một lần) tạo ra bốn Category đối tượng với các giá trị như sau:

name  ascOrder descOrder 
====  ======== ========= 
Adult  1   3 
Child  2   2 
Vision  3   1 
None  4   4 

Thay category thuộc tính của thực thể của bạn với một mối quan hệ (to-one) để Category. Mối quan hệ nghịch đảo nên là nhiều. Bây giờ thay vì đặt giá trị thuộc tính thành, ví dụ: "Người lớn", bạn sẽ đặt mối quan hệ thành đối tượng Category với name "Người lớn". Sau đó, bạn có thể định cấu hình FRC của mình để sắp xếp các đối tượng theo khóa category.ascOrder hoặc category.descOrder và chỉ định tương ứng sectionNameKeyPath.

Kết quả sẽ là bảng của bạn sẽ được nhóm thành các phần và được sắp xếp chính xác. Tuy nhiên, vì sectionNameKeyPathascOrder (hoặc descOrder), phần name thuộc tính sẽ là 1,2,3 hoặc 4, thay vì "Người lớn", "Con", v.v. Để khắc phục điều này, trong phương pháp titleForHeaderInSection hoặc viewForHeaderInSection của tableView, không sử dụng:

let sectionInfo = self.fetchedResultsController.sections![section] 
let sectionName = sectionInfo.name 

nhưng thay vì lấy tên bằng cách vượt qua các mối quan hệ từ mục đầu tiên trong phần:

let sectionInfo = self.fetchedResultsController.sections![section] 
let firstItem = sectionInfo.objects![0] as! YourEntity 
let sectionName = firstItem.name 

có thể có vấn đề tương tự với tiêu đề chỉ số, nếu bạn đang sử dụng chỉ số .

Nếu ứng dụng của bạn đã hoạt động, một nhược điểm của phương pháp này sẽ là cần phải thực hiện di chuyển dữ liệu của bạn. Tôi không thể nhớ liệu di chuyển nhẹ có thể xử lý thay thế một thuộc tính có mối quan hệ với một thực thể mới hay không; Tôi để nó cho bạn điều tra.

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