前言:我已尝试将tableView.reloadData()
添加到viewWillAppear
(...和viewDidLoad
,viewDidAppear
等) 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()
}
答案 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