另外几点要澄清以下问题:
所有这些都发生在一个视图控制器中,它执行核心数据以及主要的tableview访问。我做了一点挖掘(就像我真的不确定在iOS应用程序中加载什么时那样)现在又知道了一点。重载调用实际上正在工作(好像我硬编码更改单元格并调用表视图更改的重载数据)。排序在viewdidload上正常工作,并在程序首次加载时调用fetchedresultsController变量。如果我用println注释那个部分除了在第一次加载时没有打印,所以当调用reloaddata时从不调用sort,因此视图没有改变,因为视图没有改变!!那么,所有这些都让我问我如何调用程序在手动启动时发生的排序?感谢您耐心处理愚蠢的新手问题
我正在开发一个基于核心数据的应用程序,其主表视图按主键排序。
一切正常,我现在已经添加了一个分段控件来定义如何求助数据(按日期,按名称,按值等),并且也可以正常工作,因为fetchedresultscontroller会看到选择并相应地进行排序(如果我硬编码选择并结束并重新启动应用程序)。
我的问题是,当我更改段选择时,我无法弄清楚如何让表视图重新加载。我使用过self.tableview.reloadData()
,但我无能为力。我怀疑我太简单地看着这个,不知何故必须调用sort / fetchedresultscontroller,但是如何做到这一点却不知所措。我需要调用一个特定的方法吗?我对这一切都比较新,所以请轻轻一点!代码如下:
@IBAction func indexChanged(sender: UISegmentedControl) {
switch segmentedControl.selectedSegmentIndex
{
case 0:
segmentSortChoice = 0;
case 1:
segmentSortChoice = 1;
case 2:
segmentSortChoice = 2;
case 3:
segmentSortChoice = 3;
default:
break;
}
self.tableView.reloadData()
}
另外 - 这是在核心数据部分 - 我是否试图以某种方式从这里调用排序?
var fetchedResultsController:NSFetchedResultsController { if _fetchedResultsController!= nil { return _fetchedResultsController! }
let fetchRequest = NSFetchRequest()
// edited to use the Opportunity entity
let entity = NSEntityDescription.entityForName("Opportunity",
inManagedObjectContext: self.managedObjectContext!)
fetchRequest.entity = entity
// Set the batch size to a suitable number.
fetchRequest.fetchBatchSize = 20
// edited to sort by opportunity name and then aaccount name;
// both using case insensitive comparisons
let oppNameSortDescriptor = NSSortDescriptor(key: "oppName",
ascending: true, selector: "caseInsensitiveCompare:")
let accNameSortDescriptor = NSSortDescriptor(key: "accName",
ascending: true, selector: "caseInsensitiveCompare:")
let valueSortDescriptor = NSSortDescriptor(key: "dollarValue",
ascending: false, selector: "caseInsensitiveCompare:")
let closeDateSortDescriptor = NSSortDescriptor(key: "closeDate",
ascending: false, selector: "caseInsensitiveCompare:")
// The section below will sort the table view based on the selection in the segmented view
segmentSortChoice = NSUserDefaults.standardUserDefaults().valueForKey("SortPref") as! Int
if segmentSortChoice == 0
{fetchRequest.sortDescriptors =
[oppNameSortDescriptor, accNameSortDescriptor]}
if segmentSortChoice == 1
{fetchRequest.sortDescriptors =
[accNameSortDescriptor, oppNameSortDescriptor]}
if segmentSortChoice == 2 {
fetchRequest.sortDescriptors =
[valueSortDescriptor, oppNameSortDescriptor]}
if segmentSortChoice == 3 {
fetchRequest.sortDescriptors =
[closeDateSortDescriptor, oppNameSortDescriptor]}
答案 0 :(得分:1)
由于您懒得加载提取的结果,reloadData
只是重新显示您之前提取的先前结果。
您缺少一行代码来执行您想要的操作。添加
self.fetchedResultsController = nil
在重新加载tableView的数据之前。这将根据更新的排序顺序延迟加载新获取的结果,然后在重新加载tableView时显示。