|
// |
|
// PushPopNotifyingNavigationController.m |
|
// |
|
// |
|
// Created by Pierre Houston on 2013-07-29. |
|
// |
|
// Add new notifications to UINavigationController, see http://stackoverflow.com/questions/642312/ |
|
// To do: also override popToViewController:animated & popToRootViewControllerAnimated: |
|
|
|
#import "PushPopNotifyingNavigationController.h" |
|
|
|
@implementation PushPopNotifyingNavigationController |
|
|
|
static id previousViewControllerAssociatedObjectKey; |
|
|
|
- (UIViewController *)previousViewController { |
|
UIViewController *previousViewController = objc_getAssociatedObject(self, &previousViewControllerAssociatedObjectKey); |
|
return previousViewController; |
|
} |
|
|
|
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { |
|
BOOL delegateConforms = [self.delegate conformsToProtocol:@protocol(PushPopNotifyingNavigationControllerDelegate)]; |
|
UIViewController *previousViewController = self.topViewController; |
|
|
|
objc_setAssociatedObject(self, &previousViewControllerAssociatedObjectKey, previousViewController, OBJC_ASSOCIATION_ASSIGN); |
|
|
|
if (delegateConforms && [self.delegate respondsToSelector:@selector(navigationController:willPushViewController:)]) |
|
[(id<PushPopNotifyingNavigationControllerDelegate>)self.delegate navigationController:self willPushViewController:viewController]; |
|
if (delegateConforms && [self.delegate respondsToSelector:@selector(navigationController:willPushViewController:onto:)]) |
|
[(id<PushPopNotifyingNavigationControllerDelegate>)self.delegate navigationController:self willPushViewController:viewController onto:previousViewController]; |
|
|
|
[super pushViewController:viewController animated:animated]; |
|
} |
|
|
|
- (UIViewController *)popViewControllerAnimated:(BOOL)animated { |
|
BOOL delegateConforms = [self.delegate conformsToProtocol:@protocol(PushPopNotifyingNavigationControllerDelegate)]; |
|
UIViewController *restoringViewController = (self.viewControllers.count >= 2) ? [self.viewControllers objectAtIndex:self.viewControllers.count - 2] : nil; // one back from the end |
|
UIViewController *poppedViewController = self.topViewController; |
|
|
|
objc_setAssociatedObject(self, &previousViewControllerAssociatedObjectKey, poppedViewController, OBJC_ASSOCIATION_ASSIGN); |
|
|
|
if (delegateConforms && [self.delegate respondsToSelector:@selector(navigationController:willPopViewController:)]) |
|
[(id<PushPopNotifyingNavigationControllerDelegate>)self.delegate navigationController:self willPopViewController:poppedViewController]; |
|
if (delegateConforms && [self.delegate respondsToSelector:@selector(navigationController:willPopViewController:backTo:)]) |
|
[(id<PushPopNotifyingNavigationControllerDelegate>)self.delegate navigationController:self willPopViewController:poppedViewController backTo:restoringViewController]; |
|
|
|
UIViewController *result = [super popViewControllerAnimated:animated]; |
|
|
|
if (delegateConforms && [self.delegate respondsToSelector:@selector(navigationController:isPoppingViewController:)]) |
|
[(id<PushPopNotifyingNavigationControllerDelegate>)self.delegate navigationController:self isPoppingViewController:poppedViewController]; |
|
if (delegateConforms && [self.delegate respondsToSelector:@selector(navigationController:isPoppingViewController:backTo:)]) |
|
[(id<PushPopNotifyingNavigationControllerDelegate>)self.delegate navigationController:self isPoppingViewController:poppedViewController backTo:restoringViewController]; |
|
|
|
return result; |
|
} |
|
|
|
@end |