I want to perform a action when the user pressed the back button on my UINavigationController
when arrived at a certain UIViewController
.
Unfortunately it looks like UINavigationControllerDelegate
doesn't have any methods to get notified of the popping of views.
As a workaround I now have in the viewDidDisappear
method my action, that only gets fired when animated
is YES
. This works, but it's a bit 开发者_开发问答ugly.
How should I do this properly?
The most popular way of handling a pop from navigation view controller (as well as from modal) is implementing viewWillDisappear
for your view controller.
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.isMovingFromParentViewController || self.isBeingDismissed) {
// This view controller is being popped or dismissed
}
}
If you have a reference to the controller down the stack, the one which will show when this one is popped, you can register as a delegate and check it through
navigationController:willShowViewController:animated:
You can either call a delegate method when viewWillDisappear or set logic on viewWillAppear for certain UIViewController.
you can observe to the UINavigationControllerDelegate and check if transition will happened:
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
if([navigationController.viewControllers containsObject:self])
{
NSLog(@"push");
}
else
{
NSLog(@"pop");
}
}
First you need to conform UINavigationControllerDelegate to navigation controller and implement this method
public func navigationController(
_ navigationController: UINavigationController,
didShow viewController: UIViewController,
animated: Bool) {
guard let dismissedViewController =
navigationController.transitionCoordinator?
.viewController(forKey: .from),
!navigationController.viewControllers
.contains(dismissedViewController) else {
return
}
performOnDismissed(for: dismissedViewController)
}
In performOnDismissed func, you can check dismissedViewController, like
if (dismissedViewController is DesireViewController)
then, fire your method.
精彩评论