UINavigationControllerWithCompletionBlock 0.0.8

UINavigationControllerWithCompletionBlock 0.0.8

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2015年8月

Jérôme Morissard 维护。



我的其他作品

http://leverdeterre.github.io

UINavigationControllerWithCompletionBlock

缺少的 UINavigationController API! (带有可选 completionBlock 的 push / pop)。实现使用 UINavigationController 自身的 delegate。

此项目提供

  • 一个 completionBlock 以管理您的 push/pop 事件,
  • 一种安全的方式在同一时刻推送/弹出多个控制器。
   [self.navigationController popViewControllerAnimated:YES withCompletionBlock:NULL];
   [self.navigationController popViewControllerAnimated:YES withCompletionBlock:NULL];
   [self.navigationController popViewControllerAnimated:YES withCompletionBlock:NULL];
  • 再也没有 "嵌套 pop 动画可能导致导航栏损坏",
  • 再也没有 "在意外的状态下完成导航转换。导航栏子视图树可能会损坏。"
  • 再也没有因为多个动画之间的控制器释放而崩溃。

Image

新方法

- (void)pushViewController:(UIViewController *)viewController 
                 animated:(BOOL)animated 
      withCompletionBlock:(JMONavCompletionBlock)completionBlock;

- (void)popViewControllerAnimated:(BOOL)animated 
              withCompletionBlock:(JMONavCompletionBlock)completionBlock;
- (void)popToRootViewControllerAnimated:(BOOL)animated
                    withCompletionBlock:(JMONavCompletionBlock)completionBlock;

Swizzled 方法

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;

UINavigationController+CompletionBlock 使用方法

  • (可选) 激活 Swizzling 将原生 push/pop 调用重定向到自定义实现。如果您不想替换所有的 push/pop 方法,或者您有自己的 NavigationControllerDelegate,这个 swizzling 非常有用。
typedef NS_OPTIONS(NSUInteger, UINavigationControllerSwizzlingOption) {
    UINavigationControllerSwizzlingOptionDelegate       = 1 << 0,
    UINavigationControllerSwizzlingOptionOriginalPush   = 1 << 1,
    UINavigationControllerSwizzlingOptionOriginalPop    = 1 << 2
};

+ (void)activateSwizzling;
+ (void)activateSwizzlingWithOptions:(UINavigationControllerSwizzlingOption)options;
  • 使用新的 pop/push 方法(不需要 swizzling,因为您正在调用自定义方法)
[self.navigationController popViewControllerAnimated:YES withCompletionBlock:NULL];
[self.navigationController pushViewController:vc animated:YES withCompletionBlock:^(BOOL successful) {
   NSLog(@"Hi ! Push done !");
}];
  • 使用 "旧" Apple API。(需要 Swizzling)。原生调用将被重定向到新的自定义 API,并带有默认的 NULL completionBlock。
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController pushViewController:vc animated:YES];

使用 CocoaPods 安装

只需在 podfile 中添加以下行

pod 'UINavigationControllerWithCompletionBlock'

Image