ios - UINavigationControllerDelegate 的 didShowViewController 方法被调用了两次

标签 ios swift uinavigationcontroller

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)
      }
}

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

sss
showViewController
showViewController

“didShowViewController”被调用了两次。 我不确定发生了什么

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

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

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

最佳答案

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

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

// ...

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

关于ios - UINavigationControllerDelegate 的 didShowViewController 方法被调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461507/

相关文章:

ios - UserDefaults 自动登录不起作用

iOS 如何在顶 View Controller 弹出时以编程方式检测?

iOS - 默认事件加载器,如 "please wait"

ios - 无法在真实设备上获得 FCM token 但在模拟器上获得

ios - UIView over UIScrollView 阻止它滚动

objective-c - 如何在用户的语言环境中获取星期几的名称?

swift - 如何在 swift 中从 UIViewController 呈现 SKScene

swift - SpriteKit,复制物理体不会复制设置?

ios - 禁用后退按钮文本

ios - 如何在 iOS 中保存/恢复 View 状态?