从分段控件重新加载表视图

时间:2015-05-11 05:28:01

标签: swift reloaddata

另外几点要澄清以下问题:

所有这些都发生在一个视图控制器中,它执行核心数据以及主要的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]}

1 个答案:

答案 0 :(得分:1)

由于您懒得加载提取的结果,reloadData只是重新显示您之前提取的先前结果。

您缺少一行代码来执行您想要的操作。添加

    self.fetchedResultsController = nil

在重新加载tableView的数据之前。这将根据更新的排序顺序延迟加载新获取的结果,然后在重新加载tableView时显示。