我有一个从BaseViewController.swift继承的类。我为核心数据更改跟踪定义了一个标志:

var coreDataUpdated: Bool?

我还为viewWillAppearBaseViewController.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.coreDataUpdatedself.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/

10-10 20:55