Секционирование TableView и строк с основными данными Swift
У меня есть две таблицы в sqlite:
Код был сгенерирован генерацией XCode:
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
}
Я хочу поместить события враздел и eventDetails встроки .
Я создал метод для загрузки событий:
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, чтобы определить количество строк в разделе. Потому что я не могу получить доступ к деталям.графу или еще кому-то это понравилось.
Я думаю, что есть другой способ сделать это. Я видел что-то вроде использования NSFetchedResultsController но без успеха.
Я хотел бы получить некоторую помощь.
2 ответов:
Просто подсказка: если вы используете CoreData и UiTableView, используйте NSFetchedResultsController, чтобы сделать вещи намного, намного проще. Если вы ищете начальную точку и пример кода-просто создайте новый проект master-detail-application в Xcode и включите "использовать основные данные" в диалоговом окне.
Теперь, прямо к вашему вопросу: пример "реализации" 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 }
Согласно ответу кросс-кода!
Я сделал некоторые изменения!
1-мне нужно было реализоватьпротокол NSFetchedResultsControllerDelegate ;
2 - мне нужно было объявить fechedResultsController
3-мне нужно было установить правильную таблицу в сущности для NSEntityDescription ;
4-Мне нужно было перейти в отношении к группе по startdate в sectionNameKeyPath
Теперь код:
//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 } }
Comments