我有一个从BaseViewController.swift
继承的类。我为核心数据更改跟踪定义了一个标志:
var coreDataUpdated: Bool?
我还为
viewWillAppear
的BaseViewController.swift
中的核心数据更改添加了一个观察器//Core data update
NotificationCenter.default.addObserver(self,
selector: #selector(self.CoreDataUpadated),
name: .NSManagedObjectContextObjectsDidChange,
object: nil)
现在,每当我收到有关核心数据更改的通知时,就将
coreDataUpdated
变量更改为true
@objc func CoreDataUpadated() {
self.coreDataUpdated = true
}
现在当我检查
ChildViewController.swift
时在viewDidAppear
中的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上工作。但是,此代码在使用swift 3的Xcode 8和iOS 10.3上工作正常。
最佳答案
类继承并不意味着子类实例继承了 super class 实例中分配给属性的值。
您有一个具有BaseViewController
属性的coreDataUpdated
实例和一个具有ChildViewController
属性的coreDataUpdated
实例,因为它继承自BaseViewController
,但它的属性值与BaseViewController
实例属性值无关;他们是不同的对象。
当您说self.coreDataUpdated = true
时,您是在BaseViewController
实例上设置属性。
当您说super.coreDataUpdated
时,是指它的 super class 定义的coreDataUpdated
实例中的ChildViewController
属性。由于从未为该属性分配值,因此为nil
。
由于ChildViewController
不会覆盖coreDataUpdated
,因此super.coreDataUpdated
与self.coreDataUpdated
实例中的ChildViewController
相同,因此您可以将该if
语句重写为:
func reloadData() {
if self.coreDataUpdated ?? false {
tableView?.reloadData()
}
}
希望这可以使
coreDataUpdated
为什么是nil
更清楚与使用自己的
Bool
相比,检查hasChanges
实例的NSManagedObjectContext
属性可能更简单。关于ios - 父变量未针对ChildViewController更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45811257/