在标签之间切换时UITableView不会更新

时间:2015-10-23 12:10:37

标签: ios swift uitableview core-data swift2

前言:我已尝试将tableView.reloadData()添加到viewWillAppear(...和viewDidLoadviewDidAppear等) UITableViewController没有更新。我把setNeedsDisplay投入了S& G也是。

我有一个UITabBarController,上面有3个标签。每个标签都是TableViewController由核心数据支持,并使用NSManagedObjects中的NSManagedObjectContext填充。

TableViewController1我对单元格进行更改后,tableView会正确重新加载并反映更改。如果我点击TableViewController2的标签,则TVC1上的更改不会反映出来。

TVC1所做的更改会在启动之间保持不变,因为当我关闭应用并重新启动应用时,我会在TVC2上看到这些更改。

我错过了什么?任何想法都将不胜感激。

更新

以下是相关代码:

func markFavorite(sender: AnyObject) {
    // Store the sender in case you need it later. Might not need this.
    clickedFavoriteButton = sender as! UIButton

    if resultsSearchController.active {
        let indexPath = sender.tag
        let selectedSound = self.filteredSounds[indexPath]
        print("markFavorite's sender tag is \(indexPath)")
        if selectedSound.favorite == 1 {
            selectedSound.favorite = 0
        } else {
            selectedSound.favorite = 1
        }

        saveManagedObjectContext()

    } else {
        let indexPath = sender.tag
        let selectedSound = self.unfilteredSounds[indexPath]
        print("markFavorite's sender tag is \(indexPath)")
        if selectedSound.favorite == 1 {
            selectedSound.favorite = 0
        } else {
            selectedSound.favorite = 1
        }

        saveManagedObjectContext()
    }
}

func saveManagedObjectContext() {

    if managedObjectContext.hasChanges {
        do {
            try self.managedObjectContext.save()
        } catch {
            // catch error here
        }
    }
    self.tableView.reloadData()
}

3 个答案:

答案 0 :(得分:2)

总是使用NSFetchedResultsController在表格视图中显示核心数据项。它带有委托方法,可以在基础数据更改时更新表(甚至在保存之前)。

要开始,请检查Xcode模板(Master-Detail)实现。一旦掌握了它,你就会喜欢它。一切都是开箱即用的。

答案 1 :(得分:0)

您可能需要手动触发context.save(),因为核心数据不会立即保存数据。

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!

runOnMain() {
    do {
        try! self.context.save()
    } catch let error as NSError {
        //Handle any upcoming errors here.
    }
}

在主线程上运行该方法很重要,否则会出错。

这种方法应该做的工作:

func runOnMain(block: dispatch_block_t) {
    if NSThread.isMainThread() {
        block()
    }else{
        dispatch_sync(dispatch_get_main_queue(), block)
    }
}

如果这种方法适合您,请告诉我。

答案 2 :(得分:-1)

您不应尝试在视图控制器生命周期中的任何位置重新加载数据。而是为每个选项卡栏控制器创建委托,正确设置它们,并仅在数据源中的某些内容发生变化时调用委托方法。如果您不熟悉委托,可以了解有关委托的更多信息here