繁体   English   中英

将数据从 UIViewController 传递到 UITabBarController 始终为零

[英]passing data from UIViewController to UITabBarController is always nil

这是简单的代码,有一个视图 controller 并将一些字符串数据从我拥有的值传递给 uitabbarcontroller 应该打印出来,但它总是为零。

我尝试了便利初始化,但结果是一样的

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .cyan
        let randomStr = "dracarys"
        sleep(3)
        let nextController = TabBarViewController()
        nextController.str = randomStr
        navigationController?.pushViewController(nextController, animated: true)
    }
}

class TabBarViewController : UITabBarController {
    
    var str: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        debugPrint(str ?? "value is nil")
        let one = view1()
        one.str = self.str
        self.viewControllers = [one, view2()]
    }
}

class view1 : UIViewController {
    
    var str: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        debugPrint(str ?? "value is nil")
        view.backgroundColor = .red
    }
}

class view2 : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .orange
    }
}

UI 是编程编码的,所以没有涉及故事板我总是得到价值为零,我还没有能够解决这个问题。

想想这段代码中内置的时序假设:

    let nextController = TabBarViewController()
    nextController.str = randomStr

和:

    let one = view1()
    one.str = self.str

你是说,在第二个代码中:“当这个代码运行时,我的str已经被第一个代码设置(到randomStr或其他)。”

但如果这不是真的呢? 如果

    nextController.str = randomStr

    one.str = self.str

?? 然后self.str最终会为零。 您需要以不对事情发生的顺序做出任何假设的方式构建代码,原因很简单,您没有任何基础可以对该顺序做出任何假设。

故事的下一阶段也是如此:

    debugPrint(str ?? "value is nil")

您假设在该代码运行之前设置了视图控制器的str 但是您也不知道,同样,代码需要针对有关事情发生顺序的假设进行防弹。

终于在搜索了一段时间后,我能够让它工作。 苹果开发者论坛的功劳归于 OOPer

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .cyan
        let randomStr = "dracarys"
        let nextController = TabBarViewController()
        print("TabBarViewController.init() finished")
        nextController.str = randomStr
        navigationController?.pushViewController(nextController, animated: true)
    }
}
class TabBarViewController : UITabBarController {
    var str: String? {
        didSet {
            debugPrint("TabBarViewController.set:str", str ?? "value is nil")
            if let vc1 = self.viewControllers?[0] as? ViewController1 {
                vc1.str = str
            }
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let one = ViewController1()
        self.viewControllers = [one, ViewController2()]
        
        debugPrint("TabBarViewController.viewDidLoad", str ?? "value is nil")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        debugPrint("TabBarViewController.viewWillAppear", str ?? "value is nil")
    }
}
class ViewController1 : UIViewController {
    var str: String?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        debugPrint("ViewController1.viewDidLoad", str ?? "value is nil")
        view.backgroundColor = .red
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        debugPrint("ViewController1.viewWillAppear", str ?? "value is nil")
    }
}
class ViewController2 : UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        debugPrint("ViewController2.viewDidLoad")
        view.backgroundColor = .orange
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        debugPrint("ViewController2.viewWillAppear")
    }
}

我的问题是在 viewdidload 检查东西

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM