我有一个名为RootViewController的主UIViewController为

import UIKit
class RootViewController: UIViewController {
    var amIaccessible: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}


和两个名为oneViewController和twoViewController的子控制器继承RootViewController为:(另请阅读我的评论)

import UIKit
class oneViewController: RootViewController {
    var amIaccessible: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        amIaccessible = true // I have initialized this variable of RootViewController
    }
}




import UIKit
class twoViewController: RootViewController {
    var amIaccessible: Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()
        print(amIaccessible) // it should print true as initialized in oneViewController but its printing false :(
    }
}


现在的问题是,我的oneViewController是我的应用程序的初始视图,而twoViewController是在第一个视图之后初始化的第二个视图,因此我希望RootViewController成为我的单例类型控制器,可以在应用程序的整个生命周期中保存我的变量和方法。我该如何实现?

我不需要像单独的singleton类这样的解决方案,我也知道这种方式也像制作一个共享实例,该实例可以在整个应用执行期间保存变量。
所以请给我使用继承关系的解决方案

最佳答案

这是您应该注意的一些事情

class oneViewController: RootViewController {
var amIaccessible: Bool = false // here you are overridding the amIaccessible property. so if you will use this with oneViewController object it will always gives you overridden property value

override func viewDidLoad() {
    super.viewDidLoad()
    amIaccessible = true // here you are changing the overridden amIaccessible property value. if you want to change super class propert value you should use super keyword.
    print(self.amIaccessible) // true
    print(super.amIaccessible) // false


   // for e.g  super.amIaccessible = true // in the same way access it with super keyword.
 }
}


如果在twoViewController中要访问RootViewController的amIaccessible属性,则必须将super与property一起使用,并且如果从oneViewController更改amIaccessible属性的值,则在twoViewController中将无法获得相同的值,因为iOS的每个对象都会创建新属性,并在从内存中取消分配时杀死它们。

class twoViewController: RootViewController {
var amIaccessible: Bool = false

override func viewDidLoad() {
    super.viewDidLoad()
    print(super.amIaccessible) // it will always gives you false
}


}

09-13 00:58