【问题标题】:pushViewController is not run if i do not assign object to self如果我不将对象分配给 self,则 pushViewController 不会运行
【发布时间】:2018-04-17 06:20:02
【问题描述】:

请详细解释为什么我们必须写“obj?.mainObj = self”行,以便 pushViewController 方法工作?所以如果我删除“obj?.mainObj = self”行,pushViewController 不会工作,但为什么?

class ViewController: UIViewController {
    var obj:Bo?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        obj = Bo()
        //  obj?.mainObj = self
        obj?.setupViews()

    }

    func push(){
        print("hello")
        let controller = AppDetailController()
        navigationController?.pushViewController(controller, animated: true)

    }
}

class Bo:UIViewController{

    var mainObj:ViewController?

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

    func setupViews(){
        mainObj = ViewController()
        mainObj?.push()
    }
}

【问题讨论】:

  • 将一个类方法交给另一个你需要调用 self.提供从哪个控制器委托您的方法(另一个类中的方法)的参考。简称委托。
  • 如果您尝试从 ViewControler 推送到 Bo ,您可以直接在任何按钮点击或 viewDidAppear 中调用推送功能。您在此处遵循的过程称为委托。
  • AppDetailController 在哪里?

标签: ios swift swift3 swift2 xcode8


【解决方案1】:

您在 BO 类中的 ViewController 为 nil。然后 "nil"?.push 什么都不做。

它的 nil 原因是“ViewDidLoad”在你初始化它时/之后没有执行。它在推送后执行并加载了其中的每个视图。

这里:var mainObj:ViewController? U 将 init 方法设置为 init mainObj 为 nil。既然你放了一个“?”类型之后。删除它,它会要求一个通过 ViewController 的 init。

所以在 Init 上传递 ViewController 或在初始化后手动设置它,就像你正在做的那样。

【讨论】:

  • 按定义:open var navigationController: UINavigationController? { get } // 如果此视图控制器已被推送到导航控制器,则返回它。所以“self”是一个带有navigationController的ViewController。并且 ViewController() 没有导航控制器。再次是“零”?.pushNav ...
  • @ismail1983 选择我的答案是正确的呢?解决了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多