`
livesto
  • 浏览: 3536 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用 Storyboard Segue 实作 UIViewController 的切换 (实例)

阅读更多


 

Storyboard 是在 iOS 5 SDK 中才出现的新名词,它其实就是原本的 Xib 档案(Interface Builder),用来制作介面排版方面的工具,当然在 Storyboard 里也多了很多应用的元件,其中 Storyboard Segue 可以让你几乎连程式码都不用写,就轻松完成两个 UIViewController 的切换工作,以下是我们的示范。

 

 首先在开啓新专案时选择 Single View Application 来简化流程,可以少制作一个 UIViewController 与它对应的 class 档,如果各位有需要当然也可以开啓完全空白的干净的新专案,再自行加入 storyboard 与 UIViewController。

 

 接着来到专案下的 storyboard 画面,从右下方的元件库中拉一个 UIViewController 到 storyboard 中,并且分别对两个 UIViewController 做介面上的设计:增加 Navigation Bar 来辨识彼此,与一个用来做页面切换按钮,如下图。

 

 

我们希望在页面 1 按下前往页面 2 的按钮时,画面能切换至页面 2,之后也能以同样的方法返回页面 1,为了达到目的,必须使用 Storyboard Segue 元件将两个 UIViewController,给连起来,由于 Storyboard Segue 是动态产生的,所以并不会出现在元件 Storyboard 的元件库中。

 

 产生 Storyboard Segue 的方法常简单,就如同替介面元件和程式码做连结的拖曳方式一样的直觉,使用滑鼠右键将页面 1 内的按钮拖曳连结至页面 2 ,并选择 Model 做连结,Storyboard Segue 就会自动连结两个 UIViewController,如下图。

 

 

现在你可以用模拟器执行看看,在 Segue DEMO 页面 1 按下前往页面 2 的按钮时,画面就会切换至页面 2,如果想要使用不同的换页效果,可以在 Storyboard Segue 中的 Transition 属性做修改,范例中所使用的是翻页 Partial Curl 效果。

 

下来就是从页面 2 「返回」页面一,在这里我们特别强调「返回」而不是前往,一个错误的做法,是按照上面的步骤将页面 2 的按钮拖曳连结至页面一的 Model,使整个 Storyboard 的佈局如下图。

 

 

如果你按照这样的设计方式来执行,你会发现两个页面的确可以互相切换,功能上是正确,但是背后的意义却大不相同,而且在多次切换后很有可能创造过多的 UIViewController 实体,这样做画面每次都会朝同样的方向来做切换的效果,每次都会建立一个新的 UIViewController 实体来使用。

 

 我想大家应该都猜到正确的做法应该是在页面 2 的程式码中使用 dismissModalViewControllerAnimated: 方法,或是 dismissViewControllerAnimated:completion: 方法来解散页面 2,并返回先前的页面。

 

 替专案新增一个 UIViewController 的 Subclass,我们命名为 Page2ViewController,并取消 With XIB for user interface(我们已经建立了它的介面),接着在其中实作一个按钮事件来解散页面,程式码如下。

 

- (IBAction)returnToFirstPage:(id)sender {  
[self dismissViewControllerAnimated:YES completion:^{}];  
}

 

最后回到专案下的 Storyboard,将我们新产生的 UIViewController 与 Page2ViewController 做连结,连结的方式是在 UIViewController 的属性中选择对应的 class 档,如下图,之后将其按钮元件与 Page2ViewController 的按钮事件做连结即可。

 


现在再用模拟器执行看看,按下页面 2 中的按钮,画面会以相反的方向的切换效果来返回页面 1。

 


我们已经成功建立两个可以互相切换的 UIViewController,一个是透过 Storyboard Segue 来切换,另一个则是使用 dismissViewControllerAnimated: 的方法来返回先前的 UIViewController,接下来就是要解决两个 UIViewController 之间传值的问题,这里同样提供两个方法,在页面 1 的部份同样使用 Storyboard Segue 来帮助我们传递资讯给页面 2,而在页面 2 的部份,则是使用老方法,透过代理委托 delegate 的方式来传送资讯。

 

 首先我们在两个 UIViewController 分别拉一个 UITextField 元件,并将此元件与 class 做连结,分别命名为 page1TextField 与 page2TextField,连结的方式可以参考从使用 UIButton 说 Hello 开始说起(上)ㄧ文,如果是使用 Xcode 4 的朋友也可以直接参考 Xcode 4 的 Assistant Editor 关联编辑功能ㄧ文,节省撰写程式码的时间。

 

 在透过 Storyboard Segue 传值的部份,我们必须在页面 2 的 UIViewController class 里设置一个 NSString 的变数,它的目的是用来接收由页面 1 透过 Storyboard Segue 所传过来的资讯,程式码如下。

 

@property (weak) NSString *string;  
  
//别忘了在对应的实作档中加入@synthesize string;

 

之后在 viewDidLoad 的函式里我们将 string 的值指定给 page2TextField,这个动作会让页面 2 的画面在被开啓时就会把 page2TextField 的内容设成 Storyboard Segue 所传送过来的值。

 

- (void)viewDidLoad  
{  
[super viewDidLoad];  
  
page2TextField.text = string;  
}

 

接着回到页面 1 的 UIViewController class 里,新增一个内建的函式如下,就完成透过 Storyboard Segue 传值的方法。

 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  
  
//将page2设定成Storyboard Segue的目标UIViewController  
id page2 = segue.destinationViewController;  
  
//将值透过Storyboard Segue带给页面2的string变数  
[page2 setValue:page1TextField.text forKey:@"string"];  
}

 

另一个方法就是使用代理委托 delegate 的方法,透过建立一个协定 @protocol 的方式,让其它的採纳此协定的 class 可以实作协定内的函式,我们在页面 2 的 UIViewController class 里设置一个协定,并且在页面 1 的 UIViewController class 里实作协定里的方法,让程式执行到页面 2 时,仍然能够取得页面 1 的实例 Instance,进而使用协定里的方法来设定 page2TextField 的数值。

 

 首先来到页面 2 的 UIViewController class,建立一个协定 Page2Delegate,并且定义其内部的方法 passValue:,接着宣告一个採用此协定的物件 delegate,其程式码如下。

 

#import <UIKit/UIKit.h>  
//建立一个协定  
@protocol Page2Delegate  
  
//协定中的方法  
- (void)passValue:(NSString *)value;  
  
@end  
  
@interface Page2ViewController : UIViewController  
@property (weak, nonatomic) IBOutlet UITextField *page2TextField;  
@property (weak) NSString *string;   
  
//宣告一个採用Page2Delegate协定的物件  
@property (weak) id delegate;  
@end

 

接下来就是决定协定中的方法要在什么时候生效,也就是要在什么地方呼叫 passValue: 方法函式,而此函式会在採用此协定的类别 Class 中被实作。回顾程式的需求,我们希望在页面 2 按下返回页面 1 的按钮时,能将 page2TextField 的数值传给页面 1 的 page1TextField,所以呼叫协定 passValue: 方法的程式码,势必要写在此按钮事件中。

 

- (IBAction)returnToFirstPage:(id)sender {  
  
[self dismissViewControllerAnimated:YES completion:^{}];  
  
//呼叫协定中的方法并带入page2textField的数值  
[delegate passValue:page2TextField.text];  
}

 

现在,当我们按下页面 2 的按钮时,就会呼叫採用 Page2Delegate 协定的 class,而此 class 必须要实作此协定内的方法,所以回到页面 1 的 UIViewController class,我们要替此 class 採用 Page2Delegate 的协定,并且实作协定内的 passValue: 方法函式。

 

 採用协定的方式是在 @interface 区段的地方加上 <协定名称> 的程式码,由于此协定是写在别的 class 中,所以在採用协定之前别忘了先引用它,以下是页面 1 的 UIViewController class .h 标头档。

 

#import <UIKit/UIKit.h>  
  
//引用持有Page2Delegate协定的class  
#import "Page2ViewController.h"  
  
@interface MLViewController : UIViewController  //採用协定  
@property (weak, nonatomic) IBOutlet UITextField *page1TextField;  
  
@end

 

接着在 .m 实作档中实作协定内的 passValue: 方法函式。

 

- (void)passValue:(NSString *)value {  
  
//设定page1TextField为所取的的数值  
page1TextField.text = value;  
}

 

最后一个步骤,也就是大家常常会忘记的,要将代理 delegate 设成自己(页面 1 的 UIViewController),也就是大家在使用协定时最常写的一行程式码 object. delegate = self(object 指的就是页面 2 的 UIViewController),至于这行程式码要写在哪里?还记得之前透过 Storyboard Segue 传值的部份,我们已经藉由内建的函式取得页面 2 的 UIViewController 实例 page2,所以我们修改此内建函式,利用 page2 来设定 delegate 变数。

 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {  
  
//将page2设定成Storyboard Segue的目标UIViewController  
id page2 = segue.destinationViewController;  
  
//将值透过Storyboard Segue带给页面2的string变数  
[page2 setValue:page1TextField.text forKey:@"string"];  
  
//将delegate设成自己(指定自己为代理)  
[page2 setValue:self forKey:@"delegate"];  
}

 

如果忽略此步骤,页面 2 里的 delegate 参数在呼叫 passValue 方法时,并不会知道是谁(哪个 class)实作了它的方法,因此参数也无法由页面 2 传递至页面 1。

 

ps:如果你对于解散 UITextField 的小键盘有问题,可以参考UITextField 输入结束后的收起小键盘的方式ㄧ文。

 

来源:http://furnacedigital.blogspot.com/2011/12/storyboard-segue-uiviewcontroller.html

分享到:
评论

相关推荐

    使用storyboard 的segue 从后向前进行传值

    通过以上步骤,我们就可以使用 storyboard 的 segue 从后向前传递值了。在实际项目中,这通常用于在不同视图控制器间共享用户输入的数据或状态信息,提高了代码的可读性和可维护性。掌握这一技巧对于 iOS 开发者来说...

    ios_storyboard_helloworld实例

    通过这个简单的“ios_storyboard_helloworld”实例,你不仅学会了如何使用`Storyboard`创建基本的用户界面,还对Objective-C和iOS应用的基础架构有了初步的认识。这只是一个起点,随着学习的深入,你将能够创建更...

    [IOS] Storyboard全解析-第一部分

    每个Scene代表一个UIViewController的实例,而Segue则定义了用户在不同界面间切换的方式。 1.2 优点 - 提高效率:通过拖放方式构建UI,减少了手动编写代码的时间。 - 易于理解:视觉化的界面设计使得整个应用的导航...

    学习storyboard的demo

    - 使用这个方法可以从Storyboard中动态加载并返回指定Storyboard ID的ViewController实例。 9. **Storyboard References**: - iOS7引入了Storyboard References,允许在一个Storyboard中引用另一个Storyboard,...

    storyBoard常见用法

    - 在Storyboard中,你可以通过拖拽的方式添加`UIViewController`实例,然后自定义其属性,如背景颜色、大小等。 - 为每个视图控制器设置类名,这样它们就可以与特定的代码文件关联起来,实现自定义逻辑。 - 通过`...

    iOS开发教程:Storyboard全解析-第一部分

    在Storyboard中,每个矩形框被称为一个"Scene",代表一个UIViewController实例或其子类。每个Scene可以包含多个UI元素,如按钮、文本框、图片视图等。Scene间的连线表示了用户在应用中的导航路径,这些连接被称为 ...

    Storyboard

    .instantiateViewController(withIdentifier:)`方法,可以基于Storyboard ID实例化一个ViewController,将其添加到导航栈或用其他方式显示。 8. **Delegation and Protocol**: 在Storyboard中,可以设置...

    ios-button点击切换.zip

    最常用的是使用`UIStoryboardSegue`,在Storyboard中通过关系segue(StoryboardSegue)直接连接按钮到目标视图控制器。另一种是编程方式,通过`pushViewController(_:animated:)`或`present(_:animated:completion:)...

    ios原生入门之storyboard页面绘制源码(老安卓开发搞ios)

    一个Storyboard文件可以包含多个Scene,每个Scene代表一个UIViewController的实例。通过 segues(过渡)连接这些Scene,可以定义用户导航路径。Segue有两种主要类型:unwind segue(反向导航)和push segue(导航栈...

    AddStoryboardTest2 Demo代码

    `AddStoryboardTest2 Demo`是一个展示如何在现有项目中添加和使用Storyboard的实例。这个Demo着重于如何集成新的Storyboard文件、创建UIViewController子类以及设置UIStoryboardSegue来实现页面间的跳转。 首先,`...

    ios-tabbar 简单实现的选项卡切换.zip

    `UITabBarController`是苹果提供的系统类,用于管理多个`UIViewController`实例,每个实例对应一个选项卡。它会自动处理选项卡间的切换,且内置了Tab Bar的显示。 3. **UIViewController子类化**: 为了实现每个...

    ios故事版传值 segue

    UIStoryboardSegue是UIKit框架中的一个类,用于在两个UIViewController实例间建立链接。当用户触发一个segue(如点击按钮),系统会自动执行 segue 的 prepare(for:sender:) 方法,这为我们提供了传递数据的机会。 ...

    ios5_storyboard_springbaord

    每个Scene代表一个UIViewController的实例,而Segue则表示场景间的转换。 在本项目中,描述提到的5×4图标排列可能是一个模拟的主屏幕布局,每个图标对应一个自定义的UIViewController。开发者需要创建这些...

    用StoryBoard开始你的第一个IPhone应用程序

    本教程将聚焦于如何使用Xcode 4.2及以上版本中的StoryBoard特性,来创建你的第一个iPhone应用程序。 StoryBoard是苹果引入的一种可视化界面构建工具,它允许开发者通过拖拽和配置UI元素来设计应用的屏幕布局,从而...

    iOS开发切换视图示例

    5. 编写代码切换:如果手动切换,需要实例化目标视图控制器,然后调用`pushViewController:animated:`或`present(_:animated:completion:)`。 四、View Switcher 示例 "View Switcher"很可能是一个包含多个视图控制...

    Storyboard例子

    7. **InstantiateViewController**:在代码中,我们可以使用`UIStoryboard`类的`instantiateViewController(withIdentifier:)`方法,根据Storyboard ID实例化对应的ViewController,实现动态加载。 8. ** segues 的...

    ios淘宝storyboard项目源码

    在Storyboards中,每个屏幕通常对应一个UIViewController实例。在本项目中,开发者会看到如何为不同功能创建不同的UIViewController子类,如商品列表视图控制器、商品详情视图控制器等,以实现淘宝客户端的功能模块...

    [转]IOS开发-使用Storyboar…

    在iOS应用开发中,使用Storyboard是一种常见的界面设计和管理方式,它可以直观地构建用户界面,并通过连接不同的视图控制器(UIViewController)实现界面间的跳转。本文将深入探讨如何在Storyboard中进行界面跳转...

    iPhone多视图切换

    每个屏幕通常对应一个UIViewController实例,负责管理其视图的生命周期和行为。 2. **UINavigationController**:提供了一个在多个UIViewController之间平滑切换的容器。通过导航栏中的“返回”按钮或者编程方式,...

    AddStoryboardTest Demo下载

    - "StoryboardSegue"可以在Storyboard中直接拖动创建,用于表示用户触发的界面跳转,比如点击按钮后进入新界面。 5. **自定义Segue**: - 如果系统提供的UIStoryboardSegue不能满足需求,可以创建自定义Segue类,...

Global site tag (gtag.js) - Google Analytics