【问题标题】:UINavigationControllerDelegate‘s didShowViewController method was called twiceUINavigationControllerDelegate 的 didShowViewController 方法被调用了两次
【发布时间】:2015-12-25 09:05:41
【问题描述】:
class ViewController: UIViewController, UINavigationControllerDelegate {

      override func viewDidLoad() {
         super.viewDidLoad()
         navigationController!.delegate = self
      }

      func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
         print("showViewController")
      }

      func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
         print("sss")
      }

      func update() {
         let vc = SecondViewController()
         navigationController!.pushViewController(vc, animated: true)
      }
}

这是我演示的第一个控制器,在控制台中:

sss
showViewController
showViewController

“didShowViewController”被调用了两次。 不知道怎么回事

------一些测试----------

我在控制器的这些方法中添加了一些日志: loadView,viewDidLoad ,viewWillAppear,viewDidAppear ,这些日志的顺序是:

loadView
viewDidLoad
viewWillAppear
will:<NaviDemo.ViewController: 0x7fe8c9533050>
<NaviDemo.ViewController: 0x7fe8c9533050>
viewDidAppear
<NaviDemo.ViewController: 0x7fe8c9533050>

【问题讨论】:

标签: ios swift uinavigationcontroller


【解决方案1】:

我在代码中遇到了同样的问题。我可以通过等到viewDidAppear 设置导航委托而不是在viewDidLoad 中设置它来解决它。将其翻译为您的示例:

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

// ...

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    navigationController!.delegate = self
}

【讨论】:

  • 解决方法对我有用;但是,我建议不要强制解包选项 - 因为这是一项任务,所以没有理由这样做!
  • 同意!我只是从父问题中复制了原始代码。
【解决方案2】:

didShowViewController 被调用了两次,因为第一次在导航控制器转换到显示视图控制器时被调用。然后当它出现在屏幕上时,导航控制器自己的viewDidAppear 再次调用它,使用topViewController 作为控制器参数,在这种情况下与第一次调用它时的控制器相同。

【讨论】:

    【解决方案3】:

    UINavigationController 显示了 UIViewController 的两个实例

    来自UINavigationControllerDelegate documentation

    在导航控制器显示视图后调用 控制器的视图和导航项属性。

    不记录“showViewController”,而是记录UIViewController 实例以查看发生了什么

    func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
         print(viewController)
    }
    

    【讨论】:

    • 谢谢,我已经尝试过你的建议, 在控制台中,它会打印两次相同的实例
    • 为什么方法被调用了两次? @詹姆斯扎吉尼
    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多