Segway 0.0.1

Segway 0.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Arnaud Coomans 维护。



Segway 0.0.1

  • 作者:
  • Arnaud Coomans

Segway 是 iOS segue 的开源实现。

Segway 是一个库,它允许您以编程方式执行和撤销 segue(如使用 UIKit),但它还允许您编程方式 定义 segue。此外,它允许您在不使用任何 任何 Storyboard 的情况下执行 segue,通过直接从类和/或 Nib 加载视图控制器。最后,Segway 允许您将 用户信息附加到 segue 中,因为发送者信息不足。

无论您只是喜欢执行/准备 segue 模式,还是您想慢慢地去掉您继承的项目中的 Storyboard,Segway 都在以编程方式使用 segue 时提供了更多的灵活性。

Build Status

安装

使用静态库安装

将 Segway 项目文件复制到您的项目中,并使用静态库链接您的目标。

手动安装

  1. 克隆此存储库
  2. Segway 目录下的文件导入到您的项目中
  3. UIPopoverController+SelfRetained.m 使用 -fno-objc-arc 禁用 ARC
  4. 为目标设置 OTHER_LINKER_FLAGS="-ObjC"

用法

首先导入 segway

#import "Segway.h"

以编程方式定义 segue

定义 segue 是一个两步骤的过程

  1. 定义一个模板,当调用 performSegueWithIdentifier:sender: 时将负责创建 segue
  2. 将模板与视图控制器进行注册

模板可以指向 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 有

  • ACStoryboardPushSegueTemplate
  • ACStoryboardModalSegueTemplate
  • ACStoryboardPopoverSegueTemplate
  • ACStoryboardEmbedSegueTemplate
  • ACStoryboardUnwindSegueTemplate

一些模板需要额外的参数(例如,模态 segue 的表示选项),请查看文档获取详细信息。

请注意,建议在 viewDidLoad 方法(或 loadView)中初始化模板,因为它们可能依赖于控制器的一些视图。

然后将其附加到视图控制器

[self registerSegueTemplate:template];

执行 segue

这与 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:

混合使用 UIKit 和 Segway 黄瓜列车

当使用 Segway 时,UIKit 的黄瓜列车仍然有效。Segway 不会影响在 storyboard 中定义的黄瓜列车

  • 在 storyboard 中定义的黄瓜列车仍然可以由 storyboard 执行
  • 在 storyboard 中定义的黄瓜列车仍然可以通过编程执行

子类化

与 UIKit 类似,您可以子类化 ACStoryboardSegue 来创建自己的黄瓜列车。

如果您的黄瓜列车子类除了常规的 identifiersourcedestination 参数外没有其他参数,您可以直接使用通用的 ACStoryboardSegueTemplate 并设置它的 segueClassName 属性

ACStoryboardSegueTemplate *segueTemplate = [[ACStoryboardSegueTemplate alloc] initWithIdentifier:@"segueIdentifier" destinationViewControllerIdentifier:@"viewControllerB"];
segueTemplate.segueClassName = @"MyStoryboardSegueSubclass";

如果您需要向黄瓜列车传递更多参数,您可能需要子类化一个 ACStoryboardSegueTemplate

文档

如果您已经安装了 appledoc,可以通过运行相应的目标来生成文档。

演示

有两个演示应用程序可用

  • SegwayDemo 允许您尝试 Segway 的所有黄瓜列车
  • SegwayDemoWithoutStoryboard 允许您推送一个简单的 view controller,并且根本不需要任何 storyboard

问题和限制

鉴于 UIKit 的逆向工程复杂性及其众多(微妙)私有函数,某些方面尚未实现或表现不正确

  • 无法从弹出窗口进行逆向操作。
  • 不支持 iPad 的分割视图控制器,尤其是
    • 没有实现 replace 黄瓜列车。
    • 在分割视图控制器中执行任何其他黄瓜列车都没有实现。
  • Storyboard 不能使用 Segway 执行编程定义的黄瓜列车。您需要编程地进行调用。
  • userInfo 仅适用于编程定义的 ACStoryboardSegues。