[英]Can't set UINavigationControllerDelegate programatically (but can set via storyboard)
(XCode 8.1,Swift3。github中的示例,位於https://github.com/SuperTango/UINavigationControllerNoNavbar的標簽下,標簽為“ byhand”和“ storyboard”)
我可以通過完全按照頁面http://blog.rinatkhanov.me/ios/transitions.html中的說明在情節提要中進行設置來設置UINavigationControllerDelegate。 這是一張圖片:
這是它對我的外觀的照片:
這很好。
但是,如果我沒有在情節提要中設置委托,而是嘗試以編程方式分配相同的委托,則不會調用委托方法。
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”應該是自說明的。
有任何想法嗎?
navViewController.delegate
是一個weak var
navViewController.delegate
。 這意味着某些其他對象必須保持對委托的強烈引用,以使其保持活動狀態。 在您的代碼段中, delegate
僅保留到該代碼段的末尾(我猜這是在一種方法中)。 代碼段結束后, delegate
var就會超出范圍。 navViewController
是唯一一個對該變量具有引用的其他對象,但是它是一個weak
引用,這意味着它不會增加保留計數。 因此保留計數將為0,將釋放對象,並且navViewController.delegate
將為nil
。 您將需要在視圖控制器中添加一個屬性,以保持對JamNavigationControllerDelegate
的強烈引用,或者使視圖控制器本身成為委托。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.