QMUINavigationControllerTransitionDelegate

@protocol QMUINavigationControllerTransitionDelegate <NSObject>

与 QMUINavigationController push/pop 相关的一些方法

  • 当前界面正处于手势返回的过程中,可自行通过 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: 方法会被调用:

    1. popViewControllerAnimated:
    2. popToViewController:animated:
    3. popToRootViewControllerAnimated:
    4. 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: 方法会被调用:

    1. popViewControllerAnimated:
    2. popToViewController:animated:
    3. popToRootViewControllerAnimated:
    4. 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)