之前在网上iOS的页面跳转大多都是按回以前的那种xib的形式,但鄙人是使用storyboard的。这篇就只介绍利用storyboard进行页面跳转与传值。
新建页面
iOS的程序也是使用了MVC的思想,页面文件与代码文件是分离的,这点与Android的类似。在使用storyboard的方式中,新建页面只需要在storyboard中拖入一个View Controller则可,
接下来就可以在新建的页面中添加各种控件来编辑这个新建的页面。
在新建的页面上编排各种视图控件如同在Android中编辑那个布局的xml,但是要让程序代码与这个视图关联,需要做一些操作。首先必不可少是建立一个相关联的类,此时需要新建一个Objective-C的class,基类就选择对应的View Controller基类,这里就最简单的UIViewController,With XIB for user Interface那个复选框不能勾,点击完成便可成功建立一个View Controller。
回到stroyboard视图,选择刚刚新建的视图页面,点击下图的红框框住的部分
在下图红框处选择对应的View Controller,这样就把视图与程序代码文件View Controller关联上了。
页面跳转
建立完新页面就可以进行页面间的跳转,最简单的跳转则是用类似建立控件Outlet或者绑定事件一样,按住Ctrl键然后拖动到要跳转到的页面上,然后在弹出的窗口选择modal:
在运行程序后点击按钮就可以实现跳转。
另一种跳转的方式则是在起始页面按着Ctrl键然后拖动到目标页面中,弹出窗口的选项跟上面的一样,然后选中两个页面连线,在下图红框处给这个Segue命名:
最后在View Controller想触发跳转的地方(就比如点击按钮,则在按钮的点击事件的方法中)添加下面代码
1 | [self performSegueWithIdentifier:@“segue的名” sender:nil]; |
则可实现跳转。
跳转到新的页面后要返回上一个页面,则在需要返回的地方添加以下代码
1 | [self dismissModalViewControllerAnimated: true ]; |
参数true与false代表的是跳转的页面的切换时是否使用动画
页间传值
页面间值的传递最简单的方式是定义一个全局变量,无论是跳转还是返回,都可从该变量中get/set到值,如果不用这种方式,跳转时传值可以使用prepareForSegue sender 方法,返回时可以使用协议的方式,下面分别来看看。
使用prepareForSegue sender 方法来传递值,需要先在目标页面的View Controller的类声明处声明传递参数的属性,比如那个属性就叫value1吧,接着在起始页的地方实现方法
1 2 3 4 5 6 | -(void) prepareForSegue: (UIStoryBoardSegue *)segue sender: (id) { if ([segue.identifier compare:@ "mySegue" ]==NO) { id page2=segue.destinationViewController; [page2 setValue:self.lbUserName2.text forKey:@ "value1" ]; } } |
起到传值作用是 setValue forKey的方法,segue的destinationViewController可以获取到当前Segue所跳到的目标页面的View Controller。这里有一个判断,用于判别这个跳转动作的segue是否是需要传值的那个segue,因为如果一个页面会有多个Segue跳转到不同的页面,不这样区分,在目标页面的View Controller中没有相应的参数时则会抛出异常。
采用协议的方式进行返回时传值,思想是这样的,定义相关的协议,协议是给起始页实现的,目的在于开放一些供赋值的方法给目标页面调用,目标页面在返回的时候就调用那些方法来把返回值传回给起始页面,目标页面如何获取起始页的实例呢,那就通过页面上面的setValue forKey方法来传值,下面给一个示例
定义协议
1 2 3 4 5 | @protocol HGReturnView1Delegate <nsobject> -(void) setReturnText:(NSString *) value; @end</nsobject> |
起始页面需要实现该协议,实现部分的代码就不贴出来了。目标页的声明处需要定义一个上面的协议属性:
1 | @property (weak,nonatomic) id delegate; |
在页面跳转时传值时就调用以下代码:
1 | [self setValue:self forKey:@”delegate”]; |
在返回的时候需要用到delegate属性进行强制转换,转换后调用setReturnText方法
1 2 | NSObject<hgreturnview1delegate> *tmpDele=self.delegate; [tmpDele setReturnText: self.txtReturn.text];</hgreturnview1delegate> |
到这里页间传值就完成了。
from:cocoschina