storyboard 之 prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法的使用方法总结

  在谈到storyboard时,我们多次强调, storyboard 解决的是页面之间的跳转问题。

  一个颇为复杂的页面跳转,一旦使用了storyboard,就会四两拨千斤,你只需简单地拖拽,即可完成UIViewController 之间的跳转。

  这里面有个神器,一个极为重要的method,它就是:

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

  第一个参数是 segue, 第二个参数是 sender。

  这里给出一段代码实例,展示了这个method 的常用方法。 这段code 写在当前的ViewController 对应的.m 文件中。

  这个method 主要解决2个问题:

  (1) 获取所要跳转到的视图控制器 (ViewController);

  (2) 同时,将上一个视图的数据,传递给下一个视图。 (比如: 上一个视图是TableView, 那么,就要将点击cell的行号传递到下一个视图)。

UIViewController *destination = segue.destinationViewController;   只要是 prepareForSegue:sender: 总会声明一个目标视图控制器(destination viewcontroller);

  获取到下一个视图控制器后, 可以跳转过去了。但仅仅跳转还不够,总得将数据传递过去吧。 比如上一个视图是TableView,当用户点击某个Cell 进入下个页面时,就得将所点击的cell 行号传递给下个页面。

  有一种灵活的传递方法,通过遵循 KVC (Key -Value- Coding)规则来传值。 具体来说, 就是通过 [viewController setValue: forKey: ] 来存储数据。  既然提供了存储方式,就有对应的获取的方式。 以技术用语表达,就是: 读写操作是成对出现的。有卖,就有买。呵

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

{ UIViewController *destination = segue.destinationViewController;

  if ([destination respondsToSelector:@selector(setDelegate:)])

    {

      [destination setValue:self forKey:@"delegate"];

    }

  if ([destination respondsToSelector:@selector(setSelection:)])

    { // prepare selection info

      NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

      id object = self.tasks[indexPath.row];

      NSDictionary *selection = @{@"indexPath" : indexPath, @"object" : object};

      [destination setValue:selection forKey:@"selection"];

    }

}

  前面写的都是铺垫,接下来,我们重点谈下 prepareForSegue:sender: 的使用。 该方法的触发条件是: 
  当前的视图控制器即将被另一个视图控制器所替代时,segue将处于激活状态,从而调用prepareForSegue:sender: 方法。 
  具体对于TableView来说,当某个cell 被点击时,该cell所对应的segue将被激活,同时,这个method将被调用。我们最关心的数据传递问题, 就是利用这个时机完成的。
  在stroyboard技术出现之前, 数据的传递将通过 tableview delegate 来实现,多少有些麻烦吧。 你可以看到,用storyboard技术,技术这么简单。  当然,你也可以通过button的点击,进入下一个页面。 不管怎样,通过segue就能很轻松地实现视图的跳转。

    回过头来,我们再来仔细看看这个prepareForSegue:sender:  这个神奇的方法。

    为了区分视图的跳转,可以用上一个、下一个来表示,也可以用源视图、目标视图来表示。 即: sourceViewController 和destinationViewController。  目标视图控制器是指:即将显示(加载)的视图, 而源视图控制器是指:即将被取代的视图控制器。

    写到这里,感觉有点偷懒。 segue虽然实现的是视图之间的跳转,其实是视图控制器之间的切换。 更确切地说,segue 实现的是Secene(场景)之间的跳转。

    Scene 是由:  View 、 ViewController、First Responder、Exit  组成的。

时间: 2024-10-13 21:59:19

storyboard 之 prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法的使用方法总结的相关文章

ios - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 的写法

写法1: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. if ([segue.identifier isEqualToString:@"Projec

【转】storyboard之 prepareForSegue:sender:

在谈到storyboard时,我们多次强调, storyboard 解决的是页面之间的跳转问题. 一个颇为复杂的页面跳转,一旦使用了storyboard,就会四两拨千斤.你只需简单地拖拽,即可完成UIViewController 之间的跳转. 这里面有个神器,一个极为重要的method,它就是:     prepareForSegue:sender: 从method 简略的表达式,一眼就可看出, 它有2个参数 (arguments).为什么说呢,因为他有2个冒号嘛.  其实,这个method 的

iOS 初次是用storyboard 传值prepareForSegue: sender:方法跳转多个页面 identifier的使用

storyboard的使用有的时候很繁琐....传值方法比较单一..使用起来还是比较头痛....不过你了解之根本就慢慢熟悉它的方式...本人只做笔记不做技术.... 这里是push连接点击这里添加identifier 设置的标示符,这就是区分调转页面的唯一标识,当你触发对应事件的时候, - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 方法里面用segue 的identifier属性,就会取出对应的NSStr

storyboard有多个Segue的传递

在项目中需要在一个页面向多个页面传不同的值. 在view2Controller和view3Controller中分别有相应的Str2和Str3 1 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 2 { 3 4 NSString *view2 = @"goToView2"; 5 NSString *view3 = @"goToView3"; 6 7 if ([[segue id

SPF和Exchange Sender ID

SPF是什么?在此不再叙述SPF的概念和如何添加,具体可以参考https://postmarkapp.com/blog/explaining-spf.简单的说SPF就是一个防止仿冒邮件的一种技术,当邮件服务器接收到邮件之前,首先要验证发件人的源IP是否是对应域名TXT记录列表中,如果发件人源IP不是TXT记录中的IP,则邮件服务器认为此封邮件就是冒名邮件,接下来就会按照SPF策略处理该邮件. 在此,主要想和大家分享一下SPF和Exchange需要注意的事项. 通过上述描述,我们了解到要让SPF功

【mysql】使数据表ID连续的两个方法

经常有一些完美主义者问我,怎么让数据库的自增字段在记录被删除时重置它们的顺序,这里不去讨论这么折腾是否真有必要,只说说解决方法,有这方面需求的朋友不妨看看. 方法1.删除自增字段,然后重建(缺点就是必须记住自增字段的其它属性,不然可能会导致一些未知问题) ALTER TABLE `tablename` DROP COLUMN `id`; ALTER TABLE `tablename` ADD `id` int(10) unsigned NOT NULL AUTO_INCREMENT FIRST,

解决Incorrect integer value: '' for column 'id' at row 1的方法

在使用Navicat for MySQL还原数据库备份时,出现Incorrect integer value: '' for column 'id' at row 1的错误; 网上查资料发现5以上的版本如果是空值应该要写NULL这种问题一般mysql 5.x上出现. 使用Select version();查看, 我用的是mysql5.0.37,而创建备份的MySQL数据库版本是5.6 官方解释说:得知新版本mysql对空值插入有"bug",要在安装mysql的时候去除默认勾选的enab

PHP获取MySql新增记录ID值的3种方法

From: http://www.jb51.net/article/51473.htm 这篇文章主要介绍了PHP获取MySql新增记录ID值的3种方法,一般使用PHP自带函数mysql_insert_id() 即可实现,另2种方法权作特殊情况下使用,需要的朋友可以参考下 一.使用语句: 复制代码 代码如下: mysql_query("select max(id) from t1",$link); 使用此方法得到的是 id最大的值,确为最后一个值,但当多链接线程时,这个最大的id并不一定

区域设置 ID (LCID) 表, 及获取方法

区域设置 ID (LCID) 表, 及获取方法 中国的区域设置 ID 是 2052, 如果经常打开微软软件的安装目录应该经常见到.获取很简单, 有现成的 API 函数: GetThreadLocale. begin   ShowMessage(IntToStr(GetThreadLocale)); //2052 end; 区域设置 ID (LCID) 表 区域设置描述 简写 十六进制值 十进制值 南非荷兰语 af 0x0436 1078 阿尔巴尼亚语 sq 0x041C 1052 阿拉伯语 -