【问题标题】:Table view reload from segmented control从分段控件重新加载表格视图
【发布时间】:2015-07-21 12:23:53
【问题描述】:

补充几点来澄清以下问题:

所有这些都发生在一个视图控制器中,该控制器执行核心数据以及主 tableview 访问。我做了更多的挖掘(就像我真的不确定在 iOS 应用程序中加载什么)并且现在知道更多。重新加载调用实际上正在工作(就好像我对单元格进行硬编码并调用重新加载数据以改变表格视图)。排序在 viewdidload 上运行良好,并在程序首次加载时调用 fetchedresultsController 变量。如果我用 println 评论该部分,除了第一次加载之外什么都不会打印,因此在调用 reloaddata 时不会随后调用排序,因此视图不会改变,因为视图没有改变!那么,所有这些都让我问我如何调用程序手动启动时发生的排序?感谢您耐心处理愚蠢的新手问题

我正在开发一个基于核心数据的应用程序,该应用程序具有一个按主键排序的主表视图。

一切正常,我现在添加了一个分段控件来定义如何处理数据(按日​​期、按名称、按值等),并且工作正常,因为 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 { 如果 _fetchedResultsController != nil { 返回 _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]}

【问题讨论】:

  • 取一个公共谓词变量并在每个switch case中分配排序逻辑,在switch块之后,将此谓词应用到fetch控制器中。
  • 感谢您的帮助 - 但我需要更多指导才能使用它。我的核心数据部分中有以下代码进行排序。它似乎工作正常,但我无法使用原始帖子中示例代码中的 reloadData 项调用它。您能否让我知道我是否真的在尝试调用此代码或需要编写新代码来按照您的建议进行操作?再次,我正在学习尽可能简单!
  • 你在哪个班做这个?如果您在单例 DataManager 类中执行此操作,则调用一个委托方法到您要重新加载表的控制器。
  • 这一切都发生在一个控制器中(还有其他控制器),它处理核心数据和表格视图。如果您可以进一步提供帮助,请在上面查看我的 cmets
  • 好的,如果你在后台线程中获取数据和排序,那么试试这个。 dispatch_async(dispatch_get_main_queue(),{ self.tableView.reloadData() })

标签: swift reloaddata


【解决方案1】:

由于您延迟加载获取的结果,reloadData 只是重新显示您之前获取的先前结果。

你缺少一行代码来做你想做的事。添加

    self.fetchedResultsController = nil

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

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2018-04-12
    • 2011-09-22
    • 2014-11-13
    • 2012-07-02
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多