这是一个基于块的自定义容器视图控制器,专为应用启动、登录和注册场景设计。
我们经常遇到的一个问题是,如何处理应用的启动流程。标准的容器视图控制器(如UINavigationController
和UITabBarController
)并没有提供一个很好的解决方案来处理与应用启动相关的相关条件流程。
以下是一个典型的应用启动流程
UINavigationController
)。对此的常见解决方案是在流程中涉及的各个UIViewControls内部嵌入一些条件/一次性逻辑,并使用UINavigationController
根据这些条件推入/弹出所需的UX元素。另一种方法是使用模式控制器,甚至替换关键窗口的rootViewController
。所有这些方法都导致了一个乱糟糟的解决方案,启动序列的实际逻辑分散在多个源文件中,难以控制过渡和令人烦恼的错误。
这个自定义容器的观点是:流程中的每个UX元素都是独立的,并与流程的其他部分解耦。它只报告使用unhop
方法完成使用后,并将流程控制返回给父视图控制器。
例如,我们可以创建一个名为CLHoppingViewController
的派生类,它“跳转”到启动画面。然后,当启动画面调用unhop
时,它跳转到注册/登录UX(如果是第一次使用),或者如果没有保存会话,则跳转到最后一个会话等。
- (void)hopToViewController:(UIViewController *)newViewController then:(void(^)(void))block;
立即过渡到指定的视图控制器(交叉淡入)。当调用unhop
时,将调用block
。如果block
为nil
,则不会发生任何操作。
then
块- (void)unhop;
导致在最后的 hopToViewController:then:
中定义的 then
块被调用。
通常,这通过以这种方式访问父跳转视图控制器从子视图控制器中进行调用
#import <CLHoppingViewController.h>
- (void)readyToHopBack
{
[self.hoppingViewController unhop];
}
CLHoppingViewController 通过传递给各个跳跃函数的块支持自定义转化。
- (void)hopToViewController:(UIViewController *)newViewController
transition:(CLHoppingViewControllerTransitionBlock)transition
then:(void(^)(void))block;
这将触发跳跃期间的 transition
块。转换块的签名如下
typedef void(^CLHoppingViewControllerTransitionBlock)(UIViewController *fromViewController, UIViewController *toViewController, void(^completion)(BOOL finished));
注意:在开始转化之前,toViewController.view
将被添加到容器(containerViewForChildViewController
)的视图层次中,因此无需手动添加。
默认情况下,CLHoppingViewController
将目的视图控制器视图作为 [self view]
的子视图添加。如果您想更改此操作,请覆盖 [CLHoppingViewController containerViewForChildViewController]
并返回您希望用作子视图控制器容器的任何视图。
Elad Ben-Israel,[电子邮件保护]
CLHoppingViewController 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。