Segway 是 iOS segue 的开源实现。
Segway 是一个库,它允许您以编程方式执行和撤销 segue(如使用 UIKit),但它还允许您编程方式 定义 segue。此外,它允许您在不使用任何 任何 Storyboard 的情况下执行 segue,通过直接从类和/或 Nib 加载视图控制器。最后,Segway 允许您将 用户信息附加到 segue 中,因为发送者信息不足。
无论您只是喜欢执行/准备 segue 模式,还是您想慢慢地去掉您继承的项目中的 Storyboard,Segway 都在以编程方式使用 segue 时提供了更多的灵活性。
将 Segway 项目文件复制到您的项目中,并使用静态库链接您的目标。
-fno-objc-arc
禁用 ARCOTHER_LINKER_FLAGS="-ObjC"
首先导入 segway
#import "Segway.h"
定义 segue 是一个两步骤的过程
performSegueWithIdentifier:sender:
时将负责创建 segue模板可以指向 storyboard 中的视图控制器,通过指定其 storyboard ID
ACStoryboardSegueTemplate *template = [[ACStoryboardPushSegueTemplate alloc] initWithIdentifier:@"push" destinationViewControllerIdentifier:@"myViewControllerIdentifier"];
或者指向视图控制器类和 Nib
ACStoryboardSegueTemplate *template = [[ACStoryboardPushSegueTemplate alloc] initWithIdentifier:@"push" destinationViewControllerClassName:@"MyViewController" withNibName:@"MyViewController" bundle:nil];
可用的 segue 有
一些模板需要额外的参数(例如,模态 segue 的表示选项),请查看文档获取详细信息。
请注意,建议在 viewDidLoad
方法(或 loadView
)中初始化模板,因为它们可能依赖于控制器的一些视图。
然后将其附加到视图控制器
[self registerSegueTemplate:template];
这与 UIKit 的 segue 相同
[self performSegueWithIdentifier:@"push" sender:self];
如果您想传递额外的信息,您可以使用用户信息
[self performSegueWithIdentifier:@"push" sender:self userInfo:@{@"indexPath": indexPath}];
然后您可以实现 prepareForSegue:sender:userInfo:
以访问用户信息
- (void)prepareForSegue:(ACStoryboardSegue*)segue sender:(id)sender userInfo:(NSDictionary *)userInfo {
...
}
或者,因为 prepareForSegue:sender:
仍然有效,您也可以使用它,并从 segue 访问 userInfo
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender {
NSDictionary *userInfo = segue.userInfo;
...
}
注意:userInfo 仅适用于 ACStoryboardSegues 和逆向黄瓜列车 (Unwind)ancing VC。
与常规黄瓜列车类似,首先注册一个模板。参数 action 是一个字符串,包含了要逆向去的 selector 名称
[self registerSegueTemplate:[[ACStoryboardUnwindSegueTemplate alloc] initWithIdentifier:@"unwind" action:@"unwindAction:"]];
然后可以使用 perform 来进行逆向
[self performSegueWithIdentifier:@"unwind" sender:self];
与 UIKit 类似,它会尝试找到第一个实现了与您传递的 action 参数名称相同方法的 view controller 进行逆向
- (IBAction)unwindAction:(id)sender {
...
}
注意,与 UIKit 类似,在逆向之前不会调用 prepareForSegue:identifier:
当使用 Segway 时,UIKit 的黄瓜列车仍然有效。Segway 不会影响在 storyboard 中定义的黄瓜列车
与 UIKit 类似,您可以子类化 ACStoryboardSegue
来创建自己的黄瓜列车。
如果您的黄瓜列车子类除了常规的 identifier、source 和 destination 参数外没有其他参数,您可以直接使用通用的 ACStoryboardSegueTemplate
并设置它的 segueClassName
属性
ACStoryboardSegueTemplate *segueTemplate = [[ACStoryboardSegueTemplate alloc] initWithIdentifier:@"segueIdentifier" destinationViewControllerIdentifier:@"viewControllerB"];
segueTemplate.segueClassName = @"MyStoryboardSegueSubclass";
如果您需要向黄瓜列车传递更多参数,您可能需要子类化一个 ACStoryboardSegueTemplate
。
如果您已经安装了 appledoc,可以通过运行相应的目标来生成文档。
有两个演示应用程序可用
鉴于 UIKit 的逆向工程复杂性及其众多(微妙)私有函数,某些方面尚未实现或表现不正确