我有一个继承自 BaseViewController.swift
的类。我已经为核心数据更改跟踪定义了一个标志:
var coreDataUpdated: Bool?
我还在 BaseViewController.swift
的 viewWillAppear
中添加了核心数据变化的观察者
//Core data update
NotificationCenter.default.addObserver(self,
selector: #selector(self.CoreDataUpadated),
name: .NSManagedObjectContextObjectsDidChange,
object: nil)
现在,每当我通知核心数据发生变化时,我都会将 coreDataUpdated
变量更改为 true
@objc func CoreDataUpadated() {
self.coreDataUpdated = true
}
现在在 viewDidAppear
中的 ChildViewController.swift
中,当我检查 coreDataUpdated
时,它返回给我 nil
这是我的完整代码:
class BaseViewController: UIViewController {
var coreDataUpdated: Bool?
override func viewWillAppear(_ animated: Bool) {
//Core data update
NotificationCenter.default.addObserver(self,
selector: #selector(self.CoreDataUpadated),
name: .NSManagedObjectContextObjectsDidChange,
object: nil)
}
func CoreDataUpadated() {
self.coreDataUpdated = true
}
}
class ChildViewController: BaseViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
reloadData()
}
func reloadData() {
if super.coreDataUpdated ?? false { //I always get nil for
super.coreDataUpdated
tableView?.reloadData()
}
}
}
注意:我正在使用 swift 4 开发 Xcode 9 beta 5 和 iOS 11。但是,这段代码在 Xcode 8 和 iOS 10.3 上使用 swift 3 运行良好。
最佳答案
类继承并不意味着子类实例继承父类(super class)实例中分配给属性的值。
您有一个 BaseViewController
实例,它有一个 coreDataUpdated
属性,还有一个 ChildViewController
实例,它有一个 coreDataUpdated
> 属性,因为它继承自 BaseViewController
,但它的属性值与 BaseViewController
实例属性值无关;它们是不同的对象。
当您说 self.coreDataUpdated = true
时,您是在 BaseViewController
实例 上设置属性。
当您说 super.coreDataUpdated
时,您指的是 ChildViewController
实例 中的 coreDataUpdated
属性由它的父类(super class)定义;由于此属性从未被赋值,因此它是 nil
。
由于 ChildViewController
没有覆盖 coreDataUpdated
super.coreDataUpdated
在实例中与 self.coreDataUpdated
相同ChildViewController
,因此您可以将 if
语句重写为:
func reloadData() {
if self.coreDataUpdated ?? false {
tableView?.reloadData()
}
}
希望这能让你更清楚为什么 coreDataUpdated
是 nil
与使用您自己的 Bool
相比,检查您的 NSManagedObjectContext
实例的 hasChanges
属性可能更简单。
关于ios - 未为 ChildViewController 更新父变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811257/