无法以编程方式设置UINavigationControllerDelegate(但可以通过storyboard设置)

时间:2016-11-14 17:53:29

标签: ios swift uinavigationcontroller

(XCode 8.1,Swift 3. github中的https://github.com/SuperTango/UINavigationControllerNoNavbar示例,标签为“byhand”和“storyboard”)

我可以通过在故事板中设置UINavigationControllerDelegate来完全按照页面http://blog.rinatkhanov.me/ios/transitions.html中的说明设置它。这是一张图片:

http://blog.rinatkhanov.me/assets/posts/transitions/delegate.png

这是一张如何找我的照片:

enter image description here

这很有效。

但是,如果我没有在storyboard中设置委托,而是尝试以编程方式分配相同的委托,则不会调用委托方法。

    let delegate = JamNavigationControllerDelegate()
    NSLog(String(describing: delegate))
    navViewController.delegate = delegate
    navViewController.pushViewController(view3ViewController, animated: false)
    // and all subsequent push/pops don't use the delegate.

我在https://github.com/SuperTango/UINavigationControllerNoNavbar的github放了一个测试报告。有两个标签“byhand”和“storyboard”应该是自我解释。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

navViewController.delegateweak var。这意味着其他一些对象必须保持对委托的强引用,以使其保持活动状态。在您的代码段中,delegate仅保留到该片段的末尾(我猜测的是在方法中)。一旦代码片段结束,delegate var就会超出范围。 navViewController是唯一一个引用该变量的其他对象,但它是weak引用,这意味着它不会增加保留计数。因此,保留计数将为0,对象将被取消分配,navViewController.delegate将为nil。您需要向视图控制器添加一个属性,以保持对JamNavigationControllerDelegate的强引用,或者使视图控制器本身成为委托。