关于IOS开发中storyboard的segue和手写代码的区别

iOS 码拜 10年前 (2015-05-09) 1137次浏览 0个评论
 

最近刚接触IOS开发,所以一开始就直接步入到了storyboard的时代,没有尝试过以前所谓的XIB界面时代.所以刚开始接触的就是直接在storyboard上进行拉线进行segue来实现view之间的切换.随着学习的深入,发现UIViewCtroller中还有presentViewController:animated:completion:和dismissViewControllerAnimated:completion:方法.那么问题就来了….
1.比如viewA中有个按钮,我直接在storyboard上把这个按钮拉线拉到viewB中,然后选择modal;或者说为viewA中的按钮在其对应的controller上添加一个IBAction方法,然后再该方法内调用presentViewController:animated:completion,传入viewB的controller的对象实例。这两种方法应该都能实现点击viewA中的按钮,展示出viewB吧?不知道这两种方法有什么不同。
2.如果用storyboard上把这个按钮拉线拉到viewB中,然后再在viewB中加一个按钮,再把viewB中的这个按钮拉到viewA,这种viewB返回viewA方式会有问题么?就是类似内存没释放啊之类的问题,因为不理解segue的机制所以不确定。。。
3.在思考上面问题的时候我又有一个地方有点困惑,就是在用storyboard上segue的方式时,按理说他总会像我们手写代码的一样用一个control类来监控viewA中的按钮,那他storyboard中到底在哪个control类里添加了这个监控(即IBAction)啊。。

求大神指导。。。。

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述
引用 1 楼 zhangao0086 的回复:

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述

如果我通过调用presentViewController:animated:completion,传入viewB的controller的对象实例来达到显示viewB的方式的话会不会出现这么一种情况,如果同时有viewC的controller和viewB的相同,那么当调用presentViewController传入这个controller的时候,系统不能分辨是该modal出viewB还是viewC?

引用 2 楼 zjjnljt 的回复:
Quote: 引用 1 楼 zhangao0086 的回复:

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述

如果我通过调用presentViewController:animated:completion,传入viewB的controller的对象实例来达到显示viewB的方式的话会不会出现这么一种情况,如果同时有viewC的controller和viewB的相同,那么当调用presentViewController传入这个controller的时候,系统不能分辨是该modal出viewB还是viewC?

能分辨,viewC 和 viewB 只是说它们的 Controller 是同一个类,但是是不同的实例,也就是对象标识符不是同一个,算两个对象。

引用 3 楼 zhangao0086 的回复:
Quote: 引用 2 楼 zjjnljt 的回复:
Quote: 引用 1 楼 zhangao0086 的回复:

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述

如果我通过调用presentViewController:animated:completion,传入viewB的controller的对象实例来达到显示viewB的方式的话会不会出现这么一种情况,如果同时有viewC的controller和viewB的相同,那么当调用presentViewController传入这个controller的时候,系统不能分辨是该modal出viewB还是viewC?

能分辨,viewC 和 viewB 只是说它们的 Controller 是同一个类,但是是不同的实例,也就是对象标识符不是同一个,算两个对象。

还有一个问题就是根据我理解,发生segue之后肯定是会创建一个UIStoryboardSegue的对象实例吧?根据我目前的理解,无论你选的是modal方式还是push方式应该都是创建这个类的对象实例,那么问题来了..这两种方式调用的是同一个类创建对象,然后最终调用同一个perform的方法,那么为什么会有两种不同的效果,他们之间的差别到底是因为中间哪里不一样才导致呢? 哈哈,请版主原谅我这种喜欢打破沙锅问到底的坏习惯~~

引用 4 楼 zjjnljt 的回复:
Quote: 引用 3 楼 zhangao0086 的回复:
Quote: 引用 2 楼 zjjnljt 的回复:
Quote: 引用 1 楼 zhangao0086 的回复:

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述

如果我通过调用presentViewController:animated:completion,传入viewB的controller的对象实例来达到显示viewB的方式的话会不会出现这么一种情况,如果同时有viewC的controller和viewB的相同,那么当调用presentViewController传入这个controller的时候,系统不能分辨是该modal出viewB还是viewC?

能分辨,viewC 和 viewB 只是说它们的 Controller 是同一个类,但是是不同的实例,也就是对象标识符不是同一个,算两个对象。

还有一个问题就是根据我理解,发生segue之后肯定是会创建一个UIStoryboardSegue的对象实例吧?根据我目前的理解,无论你选的是modal方式还是push方式应该都是创建这个类的对象实例,那么问题来了..这两种方式调用的是同一个类创建对象,然后最终调用同一个perform的方法,那么为什么会有两种不同的效果,他们之间的差别到底是因为中间哪里不一样才导致呢? 哈哈,请版主原谅我这种喜欢打破沙锅问到底的坏习惯~~

因为 UIStoryboardSegue 是一个抽象类,其对应的每个操作都有一个子类,比如:
show == UIStoryboardShowSegue
present =  UIStoryboardPresentationSegue

Storyboard 会在运行时根据你的操作创建不同的子类,所以 perform 就会通过多态执行不同的动作。

1楼正解,
在第二个问题上补充,b控制器会新建出一个a控制器,而不会返回去了。想要返回去一般是在navgationbar上设置返回的按钮,并调用dismissViewControllerAnimated:completion:方法
引用 5 楼 zhangao0086 的回复:
Quote: 引用 4 楼 zjjnljt 的回复:
Quote: 引用 3 楼 zhangao0086 的回复:
Quote: 引用 2 楼 zjjnljt 的回复:
Quote: 引用 1 楼 zhangao0086 的回复:

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述

如果我通过调用presentViewController:animated:completion,传入viewB的controller的对象实例来达到显示viewB的方式的话会不会出现这么一种情况,如果同时有viewC的controller和viewB的相同,那么当调用presentViewController传入这个controller的时候,系统不能分辨是该modal出viewB还是viewC?

能分辨,viewC 和 viewB 只是说它们的 Controller 是同一个类,但是是不同的实例,也就是对象标识符不是同一个,算两个对象。

还有一个问题就是根据我理解,发生segue之后肯定是会创建一个UIStoryboardSegue的对象实例吧?根据我目前的理解,无论你选的是modal方式还是push方式应该都是创建这个类的对象实例,那么问题来了..这两种方式调用的是同一个类创建对象,然后最终调用同一个perform的方法,那么为什么会有两种不同的效果,他们之间的差别到底是因为中间哪里不一样才导致呢? 哈哈,请版主原谅我这种喜欢打破沙锅问到底的坏习惯~~

因为 UIStoryboardSegue 是一个抽象类,其对应的每个操作都有一个子类,比如:
show == UIStoryboardShowSegue
present =  UIStoryboardPresentationSegue

Storyboard 会在运行时根据你的操作创建不同的子类,所以 perform 就会通过多态执行不同的动作。

但是我没在apple的官方文档里找到你所说的这几个子类额……

30分
引用 7 楼 zjjnljt 的回复:
Quote: 引用 5 楼 zhangao0086 的回复:
Quote: 引用 4 楼 zjjnljt 的回复:
Quote: 引用 3 楼 zhangao0086 的回复:
Quote: 引用 2 楼 zjjnljt 的回复:
Quote: 引用 1 楼 zhangao0086 的回复:

1. 没什么不同
2. 这种就不是返回了,B会再创建一个A对象,dismiss的事件只能在代码里写,你应该在B里放一个Button,然后把Button的TouchUpInside连接到B里,再调用dismiss。
3. 这个Segue就是Storyboard实现的一个监控,你可以看下UIStoryboardSegue这个类,有各种动作的描述

如果我通过调用presentViewController:animated:completion,传入viewB的controller的对象实例来达到显示viewB的方式的话会不会出现这么一种情况,如果同时有viewC的controller和viewB的相同,那么当调用presentViewController传入这个controller的时候,系统不能分辨是该modal出viewB还是viewC?

能分辨,viewC 和 viewB 只是说它们的 Controller 是同一个类,但是是不同的实例,也就是对象标识符不是同一个,算两个对象。

还有一个问题就是根据我理解,发生segue之后肯定是会创建一个UIStoryboardSegue的对象实例吧?根据我目前的理解,无论你选的是modal方式还是push方式应该都是创建这个类的对象实例,那么问题来了..这两种方式调用的是同一个类创建对象,然后最终调用同一个perform的方法,那么为什么会有两种不同的效果,他们之间的差别到底是因为中间哪里不一样才导致呢? 哈哈,请版主原谅我这种喜欢打破沙锅问到底的坏习惯~~

因为 UIStoryboardSegue 是一个抽象类,其对应的每个操作都有一个子类,比如:
show == UIStoryboardShowSegue
present =  UIStoryboardPresentationSegue

Storyboard 会在运行时根据你的操作创建不同的子类,所以 perform 就会通过多态执行不同的动作。

但是我没在apple的官方文档里找到你所说的这几个子类额……

这些类不是公开的,你要在运行时把Segue 打印出来。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于IOS开发中storyboard的segue和手写代码的区别
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!