祈祷上帝能帮帮我!我已经坚持这个问题好几个星期了。
我有一个代表 coredata 对象的 TableView 。在 TableView 的顶部,我有一个分段 Controller ,代表对数据进行排序的不同方式。更改时,分段 Controller 会更新表的排列。
我遇到一个问题,在添加数据后,一切看起来都正常 - 直到我更改排序方法。离开“日期”并转到“位置”(例如)后,如果返回日期,则 header 与日期不匹配...日期应按降序显示, header 匹配...
这是相关代码(至少我是这么认为......)
@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/