3

У меня есть две таблицы в SQLite:Секционирование TableView и строки с Core Data Swift

код был сгенерирован 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, чтобы определить количество строк в разделе есть. Потому что я не могу получить доступ к details.count или что-то понравилось.

Я думаю, что есть другой способ сделать это. Я видел что-то как использование NSFetchedResultsController, но без успеха.

Я бы посоветовал некоторую помощь.

+0

должны были определены "детали" как ** в -many ** в инспекторе модели Core Data? - И тогда вы действительно должны использовать выбранный контроллер результатов. –

+0

Hi Martin R! Я определил его. У вас есть образец с Контроллером результатов? Благодаря! – Weles

ответ

9

Просто подсказка: если вы используете CoreData и UiTableView, используйте NSFetchedResultsController, чтобы сделать многое намного проще. Если вы ищете отправную точку & образец кода - просто создайте новый проект-приложение-мастер-приложение-приложение в Xcode и включите «Использовать основные данные» в диалоговом окне.

Теперь прямо на ваш вопрос: пример "внедрения" в NSFetchResultsController:

вар 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 
} 
+0

Спасибо за ваш ответ! меня устраивает. Только эта часть не работала, но я сделал некоторые изменения, и теперь она работает очень хорошо. if_fetchedResultsController! = nil { return _fetchedResultsController! } – Weles

+0

Люблю тебя за этот полностью чистый ответ :) <3 –

1

Согласно ответу crosscode в!

Я внес некоторые изменения!

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 
} 

}

Смежные вопросы