QMUINavigationControllerTransitionDelegate
@protocol QMUINavigationControllerTransitionDelegate <NSObject>
与 QMUINavigationController push/pop 相关的一些方法
-
-navigationController:
poppingByInteractiveGestureRecognizer: viewControllerWillDisappear: viewControllerWillAppear: 当前界面正处于手势返回的过程中,可自行通过 gestureRecognizer.state 来区分手势返回的各个阶段。手势返回有多个阶段(手势返回开始、拖拽过程中、松手并成功返回、松手但不切换界面),不同阶段的 viewController 的状态可能不一样。
Declaration
Objective-C
- (void)navigationController: (nonnull QMUINavigationController *)navigationController poppingByInteractiveGestureRecognizer: (nullable UIScreenEdgePanGestureRecognizer *)gestureRecognizer viewControllerWillDisappear: (nullable UIViewController *)viewControllerWillDisappear viewControllerWillAppear: (nullable UIViewController *)viewControllerWillAppear;
Swift
optional func navigationController(_ navigationController: QMUINavigationController, poppingByInteractiveGestureRecognizer gestureRecognizer: UIScreenEdgePanGestureRecognizer?, viewControllerWillDisappear: UIViewController?, viewControllerWillAppear: UIViewController?)
Parameters
navigationController
当前正在手势返回的 QMUINavigationController,由于某些阶段下无法通过 vc.navigationController 获取到 nav 的引用,所以直接传一个参数
gestureRecognizer
手势对象
viewControllerWillDisappear
手势返回中顶部的那个 vc
viewControllerWillAppear
手势返回中背后的那个 vc
-
在 self.navigationController 进行以下 4 个操作前,相应的 viewController 的 willPopInNavigationControllerWithAnimated: 方法会被调用:
- popViewControllerAnimated:
- popToViewController:animated:
- popToRootViewControllerAnimated:
- setViewControllers:animated:
此时 self 仍存在于 self.navigationController.viewControllers 堆栈内。
在 ARC 环境下,viewController 可能被放在 autorelease 池中,因此 viewController 被pop后不一定立即被销毁,所以一些对实时性要求很高的内存管理逻辑可以写在这里(而不是写在dealloc内)
Warning
不要尝试将 willPopInNavigationControllerWithAnimated: 视为点击返回按钮的回调,因为导致 viewController 被 pop 的情况不止点击返回按钮这一途径。系统的返回按钮是无法添加回调的,只能使用自定义的返回按钮。Declaration
Objective-C
- (void)willPopInNavigationControllerWithAnimated:(BOOL)animated;
Swift
optional func willPopInNavigationControllerWith(animated: Bool)
-
在 self.navigationController 进行以下 4 个操作后,相应的 viewController 的 didPopInNavigationControllerWithAnimated: 方法会被调用:
- popViewControllerAnimated:
- popToViewController:animated:
- popToRootViewControllerAnimated:
- setViewControllers:animated:
Warning
此时 self 已经不在 viewControllers 数组内Declaration
Objective-C
- (void)didPopInNavigationControllerWithAnimated:(BOOL)animated;
Swift
optional func didPopInNavigationControllerWith(animated: Bool)
-
当通过 setViewControllers:animated: 来修改 viewController 的堆栈时,如果参数 viewControllers.lastObject 与当前的 self.viewControllers.lastObject 不相同,则意味着会产生界面的切换,这种情况系统会自动调用两个切换的界面的生命周期方法,但如果两者相同,则意味着并不会产生界面切换,此时之前就已经在显示的那个 viewController 的 viewWillAppear:、viewDidAppear: 并不会被调用,那如果用户确实需要在这个时候修改一些界面元素,则找不到一个时机。所以这个方法就是提供这样一个时机给用户修改界面元素。
Declaration
Objective-C
- (void)viewControllerKeepingAppearWhenSetViewControllersWithAnimated: (BOOL)animated;
Swift
optional func viewControllerKeepingAppearWhenSetViewControllersWith(animated: Bool)