【问题标题】:Where should I set UINavigationController's delegate property?我应该在哪里设置 UINavigationController 的委托属性?
【发布时间】:2017-06-04 23:16:21
【问题描述】:

我正在处理一些自定义控制器转换,它们利用 UINavigationController 的 delegate 属性。如果我在viewDidLoad() 中设置它,self.navigationController?.delegate 在推送后的某个时间点会被释放。在viewWillAppear() 中设置它是可行的,但我想知道为什么该属性首先会被释放,以及人们通常在哪里设置此属性。

    // The first time you push, it will work correctly, and the delegate function below is called. After you pop back to this controller, delegate is nil (has been deallocated)
    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationController?.delegate = self
    }

    // Brute force works
    override func viewWillAppear(_ animated: Bool) {
        self.navigationController?.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController,
                              animationControllerFor operation: UINavigationControllerOperation,
                              from fromVC: UIViewController,
                              to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?
    {
        if operation == .push {
            return WTPPushAnimator()
        }
        if operation == .pop {
            return WTPPopAnimator()
        }
        return nil;
    }

【问题讨论】:

  • 还是没有答案吗?我看到了关闭的问题,它不会被释放,但委托方法没有触发:(
  • 似乎当你调用 navigationController?.pushViewController(vc, animated: false) 而不是 navigationController?.pushViewController(vc, animated: true) 时会发生这种情况

标签: ios swift uiviewcontroller uinavigationcontroller


【解决方案1】:

如果您推送的ViewController 也设置了navigationController?.delegate = self,那么当弹出ViewController 时,ViewController 将被释放,weak var delegate 将设置为nilviewDidLoad() 仅在首次创建 ViewController 时运行,因此当返回第一个 ViewController 时,viewDidLoad() 将不会再次运行。 viewWillAppear() 总是在推入 ViewController 或在弹出时返回时调用,因此 viewWillAppear() 是设置此 delegate 的正确位置。

【讨论】:

  • 它并没有被弹出。它是 NavigationController 的根控制器。
  • 我建议在委托值上设置一个监视断点,以找出是谁将其设置回 nil。
  • 你可以为UINavigationController委托属性写一个扩展,并在里面调用超级实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2021-02-26
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多