使用Core Data Swift对TableView和行进行分区

我在sqlite中有两个表:

代码由XCode Generation生成:

class Event: NSManagedObject { @NSManaged var startDate: NSDate @NSManaged var details: EventDetail //i think this property shoud be var details Array<EventDetail> am i correct? } class EventDetail: NSManagedObject { @NSManaged var title: String @NSManaged var location: String @NSManaged var note: String @NSManaged var endDate: NSDate @NSManaged var event: NSManagedObject } 

我想把事件放在section中 ,而eventDetails放在行中

我创build了加载事件的方法:

 var eventList : Array<AnyObject> = [] func loadEvents(){ let appDel : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate let moc: NSManagedObjectContext = appDel.managedObjectContext! let eventMO = NSFetchRequest(entityName: "Event") eventMO.returnsObjectsAsFaults = false var err : NSErrorPointer = nil eventList = moc.executeFetchRequest(eventMO, error: err)! self.tblEvento.reloadData() } func numberOfSectionsInTableView(tableView: UITableView!) -> Int { return eventList.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { //return (eventList[section] as Event).details.count return //????? what can i put here } 

我不知道我可以在方法numbertOfRowsInSection中定义该节所具有的行数。 因为我无法访问details.count或东西喜欢这个。

我认为还有其他方法可以做到这一点。 我看到一些使用NSFetchedResultsController但没有成功。

我会aprecciate一些帮助。

只是一个提示:如果你使用CoreData和UiTableView使用NSFetchedResultsController做更多的事情,更容易。 如果您正在寻找一个起点和示例代码 – 只需在Xcode中创build一个新的主 – 细节 – 应用程序项目,并打开对话框中的“使用核心数据”。

现在,直接回答你的问题:NSFetchResultsController的一个“实现”的例子:

var fetchedResultsController:NSFetchedResultsController {

  if _fetchedResultsController != nil { return _fetchedResultsController! } let fetchRequest = NSFetchRequest() // Edit the entity name as appropriate. let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: self.managedObjectContext!) fetchRequest.entity = entity // Set the batch size to a suitable number. fetchRequest.fetchBatchSize = 20 // Edit the sort key as appropriate. let sectionSortDescriptor = NSSortDescriptor(key: "startDate", ascending: true) let secondSortDescriptor = NSSortDescriptor(key: "title", ascending: true) let sortDescriptors = [sectionSortDescriptor, secondSortDescriptor] fetchRequest.sortDescriptors = sortDescriptors // Edit the section name key path and cache name if appropriate. // nil for section name key path means "no sections". let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: "startDate", cacheName: nil) aFetchedResultsController.delegate = self _fetchedResultsController = aFetchedResultsController var error: NSError? = nil if !_fetchedResultsController!.performFetch(&error) { // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. //println("Unresolved error \(error), \(error.userInfo)") abort() } return _fetchedResultsController! } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return self.fetchedResultsController.sections?.count ?? 0 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sectionInfo = self.fetchedResultsController.sections![section] as NSFetchedResultsSectionInfo return sectionInfo.numberOfObjects } 

根据crosscode的回答!

我做了一些改变!

1 – 我需要实现NSFetchedResultsControllerDelegate协议;

2 – 我需要声明fechedResultsController

3 – 我需要在实体中为NSEntityDescription设置正确的表格;

4 – 我需要通过sectionNameKeyPath中的startdate关系导航到组

现在代码:

 //1 - implementing protocol class AgendaViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate{ //2 - declare the fechedResultsController var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController() override func viewDidLoad() { super.viewDidLoad() getFetchedResultController() } func getFetchedResultController(){ let appDel : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate let moc: NSManagedObjectContext = appDel.managedObjectContext! let fetchRequest = NSFetchRequest() //3 - set the correct table let entity = NSEntityDescription.entityForName("EventDetail", inManagedObjectContext: moc) fetchRequest.entity = entity fetchRequest.fetchBatchSize = 20 let sectionSortDescriptor = NSSortDescriptor(key: "event.startDate", ascending: true) let sortDescriptors = [sectionSortDescriptor] //, secondSortDescriptor] fetchRequest.sortDescriptors = sortDescriptors //4 - navigate in relationship to group by startdate let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "event.startDate", cacheName: nil) aFetchedResultsController.delegate = self self.fetchedResultsController = aFetchedResultsController var error: NSError? = nil if !self.fetchedResultsController.performFetch(&error) { abort() } } func numberOfSectionsInTableView(tableView: UITableView!) -> Int { return self.fetchedResultsController.sections?.count ?? 0 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sectionInfo = self.fetchedResultsController.sections![section] as NSFetchedResultsSectionInfo return sectionInfo.numberOfObjects } 

}