Reputation: 1408
(XCode 8.1, Swift 3. Example in github at https://github.com/SuperTango/UINavigationControllerNoNavbar under the tags "byhand" and "storyboard")
I can set a UINavigationControllerDelegate by setting it up in a storyboard exactly as explained in the page http://blog.rinatkhanov.me/ios/transitions.html. Here's an image:
Here's a pic of how it looks for me:
This works great.
However, if I don't setup the delegate in the storyboard, but instead try to assign the same delegate programatically, the delegate methods aren't called.
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.
I put a test repo in github at https://github.com/SuperTango/UINavigationControllerNoNavbar. There are two tags "byhand" and "storyboard" which should be self explanitory.
Any ideas?
Upvotes: 0
Views: 255
Reputation: 12334
navViewController.delegate
is a weak var
. This means that some other object must keep a strong reference to the delegate so that it stays alive. In your code snippet, delegate
is only kept around until the end of that snippet (which I'm guessing is in a method). As soon as the snippet is over, the delegate
var goes out of scope. The navViewController
is the only other object with a reference to that variable, but it is a weak
reference, which means it doesn't increase the retain count. So the retain count will be 0, the object will be deallocated, and navViewController.delegate
will be nil
. You will need to add a property to your view controller to keep a strong reference to the JamNavigationControllerDelegate
, or make the view controller itself the delegate.
Upvotes: 1