ios - 未为 ChildViewController 更新父变量

标签 ios xcode nsnotificationcenter swift4

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

var coreDataUpdated: Bool?

我还在 BaseViewController.swiftviewWillAppear 中添加了核心数据变化的观察者

//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()
    }
}

希望这能让你更清楚为什么 coreDataUpdatednil

与使用您自己的 Bool 相比,检查您的 NSManagedObjectContext 实例的 hasChanges 属性可能更简单。

关于ios - 未为 ChildViewController 更新父变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45811257/

相关文章:

iphone - AFNetworking 无法下载文件

ios - NSURLSession - 控制传输速率

ios - 如何使用 NSSetUncaughtExceptionHandler 获取未捕获异常的类、方法和行号

ios - 在 Xcode 4.5 和 4.6 中调试速度非常慢

ios - Xcode 10 pod 错误

ios - 通知中心无法通过 Swift iOS 中的 AppDelegate 运行

php - IOS 游戏 - 生命再生

ios - UITabbar 项目在升级到 Xcode 7 后单击后才会显示

ios - 关闭 ModalViewController 后刷新父 ViewController

ios - 收到 NSNotification 后执行选择器会调用我的 View Controller 的 deinit