翻译:iOS视图控制器编程指南(九)——使用segue(Using Segues)

使用segue来定义应用界面流。Segue定义了应用storyboard文件中两个视图控制器之间的过渡。Segue的起点是按钮、表格行或者发起segue手势识别器。Segue的终点是你希望显示的视图控制器。Segue总是present新视图控制器,但你还可以使用一个unwind segue来dismiss视图控制器。

图9-1 两个视图控制器之间的segue

你不需要以编程的方式触发segue。在运行时,UIKit加载视图控制器相关的segue并连接它们到相应的元素。当用户与元素交互,UIKit加载适当的视图控制器,通知你的应用将发生segue,执行过渡。你可以使用UIKit发送通知,将数据传递给新视图控制器或防止segue发生。

创建视图控制器之间的segue

在同一storyboard文件中的视图控制器之间创建segue,点击第一个视图控制器的适当元素并按住Control键,拖到目标视图控制器。Segue的起点必须是一个视图或对象,有定义好的动作,如控件、按钮或手势识别器。你还可以在基于cell的视图如table和collection视图上创建segue。图9-2 展示了如何创建segue,当点击表格某行显示新视图控制器。

图9-2 创建segue关系

注意

某些元素支持多个segue。例如,表格行允许你配置不同的segue用于行accessory按钮不同的点击、其他行的点击。

当你释放鼠标按钮时,界面构建器将提示你选择两个视图控制器间的关系,如图9-3所示。选择segue对应的过渡。

图9-3 选择创建的segue的类型

当选择segue的关系类型,尽量选择自适应segue。自适应segue会自动根据当前环境调整自己的行为。例如,一个show类型的segue的行为基于present的视图控制器。提供非自适应segue的app必须运行在iOS7上,iOS7不支持自适应segue。图9-1列出了自适应segue以及他们在应用中的表现。

Segue类型 行为
Show (Push) 这个segue使用目标视图控制器的showViewController:sender: 方法显示新内容。对于大多数视图控制器,该segue以模态的方式present新视图控制器到源视图控制器上。一些视图控制器重写该方法,用它来实现不同的行为。例如,导航控制器push新视图控制器到其导航堆栈上。UIKit使用showViewController:sender: 方法定位源视图控制器。
Show Detail (Replace) 该sugue使用目标视图控制器的showDetailViewController:sender:方法显示新内容。该segue只用于嵌入到 UISplitViewController对象的视图控制器。有了该segue,分屏视图控制器用新内容代替其第二个子视图控制器(详细视图控制器)。大多数其他视图控制器以模态的方式present新内容。UIKit使用 targetViewControllerForAction:sender:方法定位源视图控制器。
Present Modally 该segue使用指定的present和过渡风格,以模态方式显示视图控制器。视图控制器定义适当的present环境处理实际present。
Present as Popover 在水平常规环境中,视图控制器以弹窗的形式出现。在水平紧凑环境中,全屏present视图控制器。

表9-1 自适应segue类型

在创建segue后,选择segue对象并使用属性检查器分配一个标识符。在segue期间,你可以使用标识符来确定触发那个segue,如果你的视图控制器支持多个segue,这个方法特别有用。标识符包含在UIStoryboardSegue对象中,当执行segue时,会传递给你的视图控制器。

在运行时修改一个segue的行为

图9-4显示了当触发segue时发生了什么。大部分工作发生在presenting视图控制器中,该视图控制器负责到新视图控制器。新视图控制器的配置基本遵循相同的步骤,如同你自己创建新视图控制器并present。因为segue都在storyboard中配置,segue涉及的两个视图控制器必须在同一个storyboard。

图9-4 使用segue显示视图控制器

在segue期间,UIKit调用当前视图控制器的方法来影响segue结果。

  • shouldPerformSegueWithIdentifier:sender:方法让你可以组织segue发生。该方法返回NO会导致segue失败但并不阻止其他行为的发生。例如,点击表中的行仍然会导致表调用代理相关方法。
  • 源视图控制器的 prepareForSegue:sender: 方法让你可以传递源视图控制器的数据到目标视图控制器。传递到该方法的UIStoryboardSegue对象包含目标视图控制器的引用以及其他segue相关的信息。

创建一个unwind segue

unwind segue可以dismiss已present的视图控制器。在界面构建器中,通过链接按钮或其他合适的对象到当前视图控制器Exit对象上创建unwind segue。当用户点击该按钮或界面上适当对象,UIKit在视图控制器层级上搜索能处理unwind segue的对象。然后它dismiss当前视图控制器和任何显示unwind segue目标的中间视图控制器。

创建unwind segue

  1. 在unwind segue的末端选择要在屏幕上显示的视图控制器。
  2. 在你选择的视图控制器中定义一个unwind动作方法。

该方法的swift语法如下:

<pre><code>
@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)
</pre></code>

该方法的Objective-C语法如下:
<pre><code>- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue</pre></code>

  1. 导航到启动unwind动作的视图控制器上。
  2. Control-click启动unwind segue的按钮(或其他对象)。该元素必须在你希望dismiss 的视图控制器上。
  3. 拖动到视图控制器场景顶部的Exit对象。
拖动到视图控制器场景顶部的Exit对象
  1. 在关系面板上选择unwind动作方法。

试图在界面构建器上创建相应的unwind seuge之前,必须在视图控制器上定义一个unwind 动作方法。该方法是必须的,告诉界面构建器有unwind segue有一个有效的目标。

使用unwind 动作方法的实现来执行app的特定任务。你不需要dismiss任何参与segue的视图控制器;UIKit为你做了。相反,使用segue对象可以获取被dismiss的视图控制器,这样你可以检索数据。还可以使用unwind动作在unwind segue完成前更新当前视图控制器。

以编程的方式启动segue

segue经常因为storyboard文件中创建的连接而触发。然而,有些时候你不能在storyboard中创建segue,可能因为目标视图控制器没有确定。例如,一个游戏应用可能根据游戏结果过渡到不同界面。在这些情况下,你可以使用当前视图控制器的 performSegueWithIdentifier:sender:方法,以编程的方式触发segue。

列表9-1展示了从竖屏旋转到横屏时,present特定视图控制器的segue。因为在这种情况中,通知对象没有提供有用的信息来执行segue命令,视图控制器指定自己作为segue的sender。

列表9-1 以编程的方式触发segue
<pre><code>- (void)orientationChanged:(NSNotification *)notification {

UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;

if (UIDeviceOrientationIsLandscape(deviceOrientation) &&

!isShowingLandscapeView) {

[self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];

isShowingLandscapeView = YES;

}

// Remainder of example omitted.

}

// Remainder of example omitted.

}
</pre></code>

创建自定义segue

界面构建器提供segue的标准用法:从一个视图控制器到另一个视图控制器的过渡或者在presenting视图控制器上以弹窗的方式显示控制器。然而,如果segue不满足你的需求,你可以创建一个自定义segue。

segue生命周期

了解如何自定义segue,你需要理解segue对象的生命周期。segue对象是UIStoryboardSegue类实例或其子类。应用不要直接创建segue;当触发sugue时UIKit会创建该对象。

  1. 创建和初始化presented视图控制器。
  2. 创建segue对象并调用其 initWithIdentifier:source:destination: 方法。在界面构建器中设置segue的标识符是唯一的字符串,另外两个参数代表了过渡中的两个视图控制器对象。
  3. 调用presenting视图控制器的 prepareForSegue:sender: 方法,参见运行时修改segue行为( Modifying a Segue’s Behavior at Runtime)。
  4. 调用segue对象的 perform方法。该方法执行一个过渡到新视图控制器。
  5. segue对象的引用被释放。

实现自定义segue

实现一个自定义segue,继承 UIStoryboardSegue并实现以下方法:

  • 覆盖initWithIdentifier:source:destination:方法并用它来初始化自定义segue对象。总是要先调用super方法。
  • 实现perform方法并用它来配置过渡动画。

注意

如果实现添加属性来配置segue,你不能在界面构建器中配置这些属性。相反,可以在触发segue的源视图控制器的 prepareForSegue:sender: 方法中配置自定义segue的附加属性。

列表9-2展示了一个非常简单的自定义segue。这个例子简单的present目标视图控制器而没有任何形式的动画,但你可以扩展实现自己的动画。

列表9-2 自定义segue

<pre><code>- (void)perform {

// Add your own animation code here.

[[self sourceViewController] presentViewController:[self destinationViewController] animated:NO completion:nil];

}
</pre></code>

官方原文地址:

https://developer.apple.com/library/prerelease/ios/featuredarticles/ViewControllerPGforiPhoneOS/UsingSegues.html#//apple_ref/doc/uid/TP40007457-CH15-SW1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容