(XCode 8.1,Swift 3. github中的https://github.com/SuperTango/UINavigationControllerNoNavbar示例,标签为“byhand”和“storyboard”)
我可以通过在故事板中设置UINavigationControllerDelegate来完全按照页面http://blog.rinatkhanov.me/ios/transitions.html中的说明设置它。这是一张图片:
这是一张如何找我的照片:
这很有效。
但是,如果我没有在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”应该是自我解释。
有什么想法吗?
答案 0 :(得分:1)
navViewController.delegate
是weak var
。这意味着其他一些对象必须保持对委托的强引用,以使其保持活动状态。在您的代码段中,delegate
仅保留到该片段的末尾(我猜测的是在方法中)。一旦代码片段结束,delegate
var就会超出范围。 navViewController
是唯一一个引用该变量的其他对象,但它是weak
引用,这意味着它不会增加保留计数。因此,保留计数将为0,对象将被取消分配,navViewController.delegate
将为nil
。您需要向视图控制器添加一个属性,以保持对JamNavigationControllerDelegate
的强引用,或者使视图控制器本身成为委托。