swift - UITableView CoreData - 排序描​​述符不影响标题

标签 swift uitableview core-data

祈祷上帝能帮帮我!我已经坚持这个问题好几个星期了。

我有一个代表 coredata 对象的 TableView 。在 TableView 的顶部,我有一个分段 Controller ,代表对数据进行排序的不同方式。更改时,分段 Controller 会更新表的排列。

我遇到一个问题,在添加数据后,一切看起来都正常 - 直到我更改排序方法。离开“日期”并转到“位置”(例如)后,如果返回日期,则 header 与日期不匹配...日期应按降序显示, header 匹配...

点击“位置”之前 Before changing segmented controller

点击“位置”并返回“日期”后 After changing segmented controller

这是相关代码(至少我是这么认为......)

@IBAction func segmentedControlChange(sender: AnyObject) {
    //call custom class for overlay loading indicator
    let progressHUD = ProgressHUD(text: "Sorting")
    self.view.addSubview(progressHUD)

    //put the table load on a different thread for processing
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
        self.getFetchResultsController()

        self.tableView.reloadData()

        //after tableview is loaded, execute this
        dispatch_sync(dispatch_get_main_queue(), {
            self.view.sendSubviewToBack(progressHUD)
            progressHUD.hide()
        })
    })
}

func getFetchResultsController(){

    let fetchRequest = NSFetchRequest(entityName: "Place")

    switch self.segmentedControl.selectedSegmentIndex {
    case 0:
        let sortByDate = NSSortDescriptor(key: "date", ascending: false)
        let sortDescriptors = [sortByDate]
        fetchRequest.sortDescriptors = sortDescriptors
        println("sorted by date")
        fetchRequest.fetchBatchSize = 30

        aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "sectionDateHdr", cacheName: nil)

        aFetchedResultsController.delegate = self

    case 1:
        let sortByState = NSSortDescriptor(key: "state", ascending: true)
        let sortByAOI = NSSortDescriptor(key: "aoiData.aoiName", ascending: true)
        let sortByDate = NSSortDescriptor(key: "date", ascending: false)
        let sortDescriptors = [sortByState, sortByAOI, sortByDate]
        fetchRequest.sortDescriptors = sortDescriptors
        println("sorted by AOI, then date")
        fetchRequest.fetchBatchSize = 30

        aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "state", cacheName: nil)

        aFetchedResultsController.delegate = self

    case 2:
        let sortByTail = NSSortDescriptor(key: "tailNum", ascending: false)
        let sortByDate = NSSortDescriptor(key: "date", ascending: false)
        let sortDescriptors = [sortByTail, sortByDate]
        fetchRequest.sortDescriptors = sortDescriptors
        println("sorted by tail, then date")
        fetchRequest.fetchBatchSize = 30

        aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "tailNum", cacheName: nil)

        aFetchedResultsController.delegate = self

    default:
        println("no coredata object to query in fetchData")
    }

    var error: NSError? = nil
    if !self.aFetchedResultsController.performFetch(&error) {
        abort()
    }
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return self.aFetchedResultsController.sections?.count ?? 0
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return aFetchedResultsController.sections?[section].numberOfObjects ?? 0
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cellIdentifier = "Cell"

    var cell : CustomTableViewCell!
    cell = self.tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomTableViewCell
    var curPlace = aFetchedResultsController.objectAtIndexPath(indexPath) as! AllPlaces

    if curPlace.hasImage == true {
        image = UIImage(data: curPlace.images.imageData)!
    } else {
    image = UIImage(named: "Placeholder")!
    }

    cell.loadItem(curPlace.hasImage, aoi: curPlace.aoiData.aoiName, date: curPlace.date, city: curPlace.city, state: curPlace.state, arrOrDep: curPlace.arrOrDep)
    cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
    cell.selectionStyle = UITableViewCellSelectionStyle.Blue

    if indexPath.row == (aFetchedResultsController.fetchedObjects!.count - 1)
    {
        self.getFetchResultsController()
    }

    return cell
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    //self.getFetchResultsController()
    let sectionInfo = self.aFetchedResultsController.sections![section] as! NSFetchedResultsSectionInfo
    return sectionInfo.name
}

最佳答案

好吧,以典型的方式,当我屈服并寻求帮助时,我就明白了。不知道为什么这有效,但这就是我所做的 -

1.) 在“AllPlaces”类中,我添加了一个函数,该函数仅查看日期并以字符串形式返回 MMMM yyyy 的值。我称之为sectionID。

    func sectionID() -> String {
    var aformatter = NSDateFormatter()
    aformatter.dateFormat = "MMMM yyyy"

    return aformatter.stringFromDate(date)
}

2.) 我之前使用过一个名为sectionDateHdr 的属性,它是相同“日期”变量的字符串格式,采用相同的MMMM yyyy 格式。由于某种原因,使用sectionID而不是sectionDateHdr导致表正确标记标题。

我真的不知道为什么......但我很欣慰它终于起作用了。我猜这与设置通过 fetchResultsController 传递的值有关。

两周后!!!解决了!

关于swift - UITableView CoreData - 排序描​​述符不影响标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32078701/

相关文章:

iOS 后台任务 Swift

ios - 如何在表格 View 中自动滚动? ( swift )

iphone - NSManagedObject 临时使用,如何在 NSObject 和 NSManagedObject 之间切换

ios 7 uitableview 单元格长按更改核心数据属性的值

ios - fetchedResultsController 不断在每一行中显示相同的实体

swift - 是否可以将整个 CoreData-Stack 放在一个框架中?

swift - CoreData/TableView - 'subscript' 的使用不明确

ios - CNMutableContact 和 iOS 13 中的 note 和 imageData

swift - 调用可选 double 值上的方法以转换为字符串

arrays - 简单的 Swift 数组扩展