diff --git a/SignalMessaging/ViewControllers/OWSNavigationController.m b/SignalMessaging/ViewControllers/OWSNavigationController.m index 8557d3155..ef85024cd 100644 --- a/SignalMessaging/ViewControllers/OWSNavigationController.m +++ b/SignalMessaging/ViewControllers/OWSNavigationController.m @@ -7,7 +7,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface OWSNavigationController (OWSNavigationController) +@interface UINavigationController (OWSNavigationController) @end @@ -106,7 +106,7 @@ NS_ASSUME_NONNULL_BEGIN { [super viewDidLoad]; - // self.interactivePopGestureRecognizer.delegate = self; + self.interactivePopGestureRecognizer.delegate = self; } #pragma mark - UINavigationBarDelegate @@ -114,51 +114,48 @@ NS_ASSUME_NONNULL_BEGIN // All OWSNavigationController serve as the UINavigationBarDelegate for their navbar. // We override shouldPopItem: in order to cancel some back button presses - for example, // if a view has unsaved changes. -//- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item -//{ -// OWSAssert(self.interactivePopGestureRecognizer.delegate == self); -// UIViewController *topViewController = self.topViewController; -// -// // wasBackButtonClicked is YES if the back button was pressed but not -// // if a back gesture was performed or if the view is popped programmatically. -// BOOL wasBackButtonClicked = topViewController.navigationItem == item; -// BOOL result = YES; -// if (wasBackButtonClicked) { -// if ([topViewController conformsToProtocol:@protocol(OWSNavigationView)]) { -// id navigationView = (id)topViewController; -// result = ![navigationView shouldCancelNavigationBack]; -// } -// } -// -// // If we're not going to cancel the pop/back, we need to call the super -// // implementation since it has important side effects. -// if (result) { -// // NOTE: result might end up NO if the super implementation cancels the -// // the pop/back. -// -// // MJK WTF?? This seems super broken. It won't compile now, but how could it ever -// // have? This is a delegate method, so how are we calling it on super? -// // [super navigationBar:navigationBar shouldPopItem:item]; -// result = YES; -// } -// return result; -//} +- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item +{ + OWSAssert(self.interactivePopGestureRecognizer.delegate == self); + UIViewController *topViewController = self.topViewController; + + // wasBackButtonClicked is YES if the back button was pressed but not + // if a back gesture was performed or if the view is popped programmatically. + BOOL wasBackButtonClicked = topViewController.navigationItem == item; + BOOL result = YES; + if (wasBackButtonClicked) { + if ([topViewController conformsToProtocol:@protocol(OWSNavigationView)]) { + id navigationView = (id)topViewController; + result = ![navigationView shouldCancelNavigationBack]; + } + } + + // If we're not going to cancel the pop/back, we need to call the super + // implementation since it has important side effects. + if (result) { + // NOTE: result might end up NO if the super implementation cancels the + // the pop/back. + [super navigationBar:navigationBar shouldPopItem:item]; + result = YES; + } + return result; +} #pragma mark - UIGestureRecognizerDelegate // We serve as the UIGestureRecognizerDelegate of the interactivePopGestureRecognizer // in order to cancel some "back" gestures - for example, // if a view has unsaved changes. -//- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer -//{ -// UIViewController *topViewController = self.topViewController; -// if ([topViewController conformsToProtocol:@protocol(OWSNavigationView)]) { -// id navigationView = (id)topViewController; -// return ![navigationView shouldCancelNavigationBack]; -// } else { -// return YES; -// } -//} +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer +{ + UIViewController *topViewController = self.topViewController; + if ([topViewController conformsToProtocol:@protocol(OWSNavigationView)]) { + id navigationView = (id)topViewController; + return ![navigationView shouldCancelNavigationBack]; + } else { + return YES; + } +} @end