簡體   English   中英

無法以編程方式設置UINavigationControllerDelegate(但可以通過故事板設置)

[英]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。 這是一張圖片:

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

這是它對我的外觀的照片:

在此處輸入圖片說明

這很好。

但是,如果我沒有在情節提要中設置委托,而是嘗試以編程方式分配相同的委托,則不會調用委托方法。

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM