swift mvcswift segue 条件跳转问题

主题 : 关于prepareForSegue问题,新手,被难住了!你们肯定会!
级别: 新手上路
UID: 151576
可可豆: 42 CB
威望: 27 点
在线时间: 15(时)
发自: Web Page
来源于&&分类
关于prepareForSegue问题,新手,被难住了!你们肯定会!&&&
我写了一个继承UITableViewController的类点击cell 向下一个页面传递一个String类型的值,在网上查资料说是,重写类中方法override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { //over func preForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {if segue.identifier == &tempData&{let controller = segue.destination as! ImageController            controller.str = sender as? String        }} 但是在父类中就没有这个方法。。希望知道的能指导一下!谢谢还有就是 A------&B&&&&A页面show Detail跳转到B页面&&&&A给B中的变量传递了一个值。我想问的问题就是,是先负值还是先初始化B页面[ 此帖被vvvevvv在 20:38重新编辑 ]
级别: 禁止发言
可可豆: 744 CB
威望: 734 点
在线时间: 387(时)
发自: Web Page
用户被禁言,该主题自动屏蔽!
级别: 新手上路
UID: 151576
可可豆: 42 CB
威望: 27 点
在线时间: 15(时)
发自: Web Page
回 1楼(fzhlee) 的帖子
复习这个方法是不报错,麻烦你再看一下我哪里错了呗!谢谢这个是第一个页面中发送代码 这个是第二个页面的   帮忙看一下!非常感谢!
级别: 禁止发言
可可豆: 744 CB
威望: 734 点
在线时间: 387(时)
发自: Web Page
用户被禁言,该主题自动屏蔽!
级别: 新手上路
UID: 151576
可可豆: 42 CB
威望: 27 点
在线时间: 15(时)
发自: Web Page
你好,这个demo对我很有帮助。只是我看了,为什么我在点击其中一行的时候,把所有列的值都会传过来呢 &&
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版> 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记21 深入多MVC模式、Segue过渡 - 博客频道 - CSDN.NET
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记21 深入多MVC模式、Segue过渡 - 博客频道 - CSDN.NET
上一话中我们介绍了多MVC模式并且以导航控制器为例讲解了这三个控制器管理多个MVC的工作原理。那么我们如何得到控制器所管理的MVC呢。控制器中有一个属性叫做viewControllers,它是一个UIViewController类型的数组。它里面存储的是一个系统中的所有ViewController,在分栏控制器中只会有两个控制器(Master和Detail),在导航栏控制器中会有Tab数目个控制器,而在导航控制器中会有堆栈中卡片数目个元素。通常我们不会对它设值,但是设值是可以的,这有点奇怪。这个设值操作通常是通过在storyboard中操作进行的。那么如何获得一个导航控制器呢,如何获得它的指针,答案是每一个视图控制器都知道自己是不是身处一个导航控制器或者是分栏和选项卡控制器之中。因为视图控制器有三个属性tabBarController、splitViewController和navigationController,这些属性会返回给你它处在哪个父控制器中,如果它不在,会返回nil,这些属性可以超过一个不同时为nil,代表它处在多个父控制器中。例如某个MVC在分栏控制器中是master的角色,它想要获取detail角色的MVC,那么它访问splitViewController这个属性,然后访问viewController[1],我们知道viewController[1]这个属性代表分栏控制器中的detail。一旦获取到那么这个master就可以给它的detail发消息了。但是我们通常不需要这么做,我们可以在storyboard中完成大部分操作,那么我们在storyboard中如何连接起这些MVC呢以分栏控制器为例,你拖到storyboard中的时候它会带出一串已经关联好的MVC,但是通常你会删掉这些以连接你自己的MVC,你需要保留的是分栏控制器本身。然后我们用之前常用的右键拖拽法就能实现连接:松手的时候会提示你想要建立什么样的连接:我们选择Master View Controller。这样就建立了一个连接,我用同样的方法拖拽到Detail上。这次选择Detail View Controller。导航控制器有一些不同,稍后我们会看到。但是这里有一个问题就是分栏显示视图不能在iphone上显示,确切地说事ip6 plus以外的iphone上,因为ip6 plus横屏的显示模式是和ipad一样的。那么如何在iphone上显示Master和Detail呢,答案是利用导航控制器,我们在我们的Master加上一个导航控制器,方法是选中控制器然后点击editor选中Embed in然后选择 Navigation Controller。现在这个Master已经嵌到一个导航控制器中了。这种方法是通用的,而且这时导航控制器成了分栏控制器中的Msster,这点要注意。我们同样可以在Detail中嵌入一个导航控制器。这样做的好处是我们可能会用到导航栏的标题栏,增加一些按钮之类的功能,但是我们从来不会用Detail做导航,因为它只会被导航,它自身不需要一个导航控制器。那么接下来该如何显示它们,我们在Master中做了一些改变需要在Detail中显示,那么该如何来做?答案是Segues(过渡)过渡是一个控制器转到另一个控制器的方法。IOS中定义了四种不同的过渡,当然你还可以自己定义过渡。1.Show Segue:展示你正在交互的那个MVC,如果你是个导航控制器,那么它就会将这个MVC置于卡片的堆栈之上并显示它,如果你不是个导航控制器,那么它会议Modally的方式展示这个MVC2.Show Detail Segue和show Segue非常像。唯一的区别是这个过渡在分栏控制器中在Detail中显示这个MVC。如果你在一个导航控制器中使用这个过渡,那么它和Show Segue的效果是一样的。3.Modal Segue:它会以占满屏幕的方式显示这个MVC,我不太推荐Modal,因为如果没有返回的操作那么APP就卡在当前页面了。4.Popover Segue:弹出Segue的目标view Controller,并让这个view Controller显示在其他东西之上,但是并不布满整个屏幕。但实际上它是布满整个屏幕的,因为用户只能与这个弹出的窗口进行交互。如果用户点击了窗口外的区域,就会取消这个popover窗口。它比Modal好的地方是,尽管它并不占满整个屏幕,但是用户可以让窗口背后的用户界面变灰暗,你点击这些灰暗的部分会让窗口弹走,所以popover很容易被取消。最后需要讲到的是无论你使用哪种方式,转到的MVC都是新创建的,你不会过渡到一个已经存在的MVC中。那么我们该如何创建这些过渡呢,你可以通过代码来创建,但是大部分情况我们都是通过storyboard拖动来创建的。下面是一个示例:我在Master上加了一个小按钮,拖拽按钮到Detail上松手然后选择过渡的方式:我们选择Show Detail。因为这是个分栏控制器,我想要完全替代Detail,如果这是一个导航控制器的话,我也许依旧选择show detail,因为我希望它被推入栈中,但是如果是在Master中就不会选择show detail,我希望它存在在master的栈中,这时会用show。这时会出现一条线。点击这条线你会在右边看到这个过渡的属性,还有一个很重要的区域叫做Identifier,这是你的过渡的唯一标志。这里我们把刚刚创建的过渡命名为Show Graph。一般来说你的命名应该能让别人看出这个过渡的作用。之前说过storyboard中的所有东西都是通过名字和你的代码连接在一起的。不管是UIview的名字、UIViewController的名字,还是action和outlet的名字,还有这里的segue的名字,也就是这个Identifier,它们都是名字,我们需要让storyboard中的名字和代码中的名字相同,这是一种松散的耦合,能让两个东西连接在一起。那么我们在代码中如何用到这个名字呢?第一种方法很简单,就是在代码中触发segue,方法是使用UIViewController的performSegueWithIdentifier方法,这种方法很少用。第二种方法是使用Identifier为segue做准备,因为如果segue被触发,那么它们就会新建一个MVC,这个MVC需要一些准备才能做你想让它做的事情。比如在Calculator这个Demo中我们要绘制曲线图,但是MVC创建的时候是一张空的,它需要数据,所以我们需要做准备。那么该如何做准备呢?MVC包含一个segue的发起者,MVC实现了一个方法叫做prepareForSegue,在这里面它包含着刚刚创建的MVC。第一个参数就是segue,这个segue里面有两个非常重要的属性,第一个是Identifier,让你知道为哪个segue做准备。第二个是这个segue新建的那个MVC,名字叫做destinationViewController,这个属性是一个AnyObject类型的,所以你需要解包它,注意在新的Swift1.2版本中这种AnyObject的解包已经全部使用as!了第二个参数叫做sender,比如UIButton或者其他触发这个segue的东西,一般来说你不会用到这个参数。请注意上面这张幻灯片上的红色字体,当你做准备的时候,页面上的outlet还没有被创建。我们之前讲过这些outlet是隐性解包的,如果你想要做一些关于outlet的属性的操作需要暂存到一个地方,不然会造成程序的崩溃,比如可以把一些操作放到outlet中属性的属性观察器中。你也可以防止一个segue的发生。如果有一些事情不允许触发,那么我们可以把这个触发segue禁掉(比如按钮不能按下)
上一话中我们介绍了多MVC模式并且以导航控制器为例讲解了这三个控制器管理多个MVC的工作原理。那么我们如何得到控制器所管理的MVC呢。控制器中有一个属性叫做viewControllers,它是一个UI
------分隔线----------------------------
相关最新文章
Copyright 2012- ( Coin163 ) All Rights Reserved &&------------------1. 最简单的方法拖拽, 这个就不用多解释了吧. 直接拖拽到另一个视图控制器, 选择 show, 就行了.2. 利用 Segue 方法&(这里主要是 方法1 的传值)连好线, 点击 连线中间部分, 设置 Identifier.然后 调用 performSegueWithIdentifier 方法.(注: Demo 里面, 是直接将 TableViewController 和 SecondViewController 进行连线, 而不是 点击 Cell 的 indicator 进行连线)执行以下 方法, 就可以进行 跳转操作了.
performSegueWithIdentifier("SecondSegue", sender: self)
如何传值?很简单, 需要调用 prepareForSegue 方法 (因为这里是 父视图 -& 子视图 传值, 所以要用 destinationViewController)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
&&& var theSegue = segue.destinationViewController as SecondViewController
&&& theSegue.text = "Pass"
(注: 这里, Swift 的 自动补全可能失效, 所以 如果没有出现 destinationViewController, 没关系往后打.)这里的 text 是我在 子视图中 声明的变量, 用来设置 Label 的 值.PS:&一般, 我们都用使用连线的方式, 这里告诉大家另一个方式, 就是用 viewWithTag. 我先前在 Label 控件 Tag 中设置为 100.&当然你也可以使用连线, 使用 viewWithTag 可以在我们自定义 Cell 的时候 方便用到, 而不需要创建单独的 Cell class.3. 利用 self.storyboard利用 self.storyboard 方法, 就不需要进行 连线, 一样可以进行视图之间的跳转. 但是必须要设置 Storyboard ID.然后利用 如下方法进行 跳转 和 传值
var thirdVC = self.storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as ThirdViewController
thirdVC.text = "Pass"
self.navigationController?.pushViewController(thirdVC, animated: true)
因为是在 同一个 Storyboard 里面进行跳转, 所以 self.storyboard 就可以满足需求.不明白? 看最后一个方法:4. 利用 UIStoryboardXIB 方法, 我们需要 用到 nibName, 同样 如果我们想要 分离多个 sence 在不同的Storyboard 里面, 怎么办?这个时候, 就不能使用 self.storyboard 了.而是:
var storyboard = UIStoryboard(name: "New", bundle: nil)
var newVC = storyboard.instantiateViewControllerWithIdentifier("NewViewController") as NewViewController
newVC.text = "Pass"
self.navigationController?.pushViewController(newVC, animated: true)
是不是 和 XIB 有异曲同工的感觉, 这样就可以把 Storyboard 分几个, 每个里面放几个 Sence.这样的好处就是, 当你需要做多个不同功能的模块的应用, 分离到不同的 Storyboard 中, 彼此互不影响.相对于 XIB 来说, 每个文件夹 只需要 1 个 Storyboard 文件, 和 Swfit 文件就可以了.
阅读(...) 评论()主题 : ios8 action segue
级别: 新手上路
可可豆: 22 CB
威望: 22 点
在线时间: 6(时)
发自: Web Page
来源于&&分类
ios8 action segue&&&
ios8 action segue 有几种方法,一般选择哪一个,每种方法都有什么用,在什么环境下使用?
图片:QQ图片14.jpg
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 3(时)
发自: Web Page
Apple的解释在这里: 我的翻译:Show: 在master或detail区域展现内容(典型的如iPad的设置界面,左侧是master,右侧是detail),究竟是在哪个区要取决于屏幕上的内容,如果不分master/detail,就单纯的把新的内容push到当前view controller stack的顶部Show Detail: 大致同Show,在detail区域展现内容,如果不分master/detail,新的内容取代当前view controller stack的顶部Present Modally:模态展示内容Present as Popover:在当前的view上出现一个小窗口来展示内容,无处不在的“选中文字后出现 复制/翻译 按钮就是这个Custom:自定义的
级别: 新手上路
可可豆: 22 CB
威望: 22 点
在线时间: 6(时)
发自: Web Page
回 1楼(plckm) 的帖子
谢谢,资料很详细受教了
级别: 新手上路
可可豆: 18 CB
威望: 18 点
在线时间: 289(时)
发自: Web Page
回 1楼(plckm) 的帖子
tks,辛苦了
级别: 侠客
UID: 439110
可可豆: 750 CB
威望: 525 点
在线时间: 2042(时)
发自: Web Page
刚好解决我得疑惑
级别: 侠客
UID: 316237
可可豆: 165 CB
威望: 150 点
在线时间: 558(时)
发自: Web Page
谢谢楼主整理,借用了
Hello Alan
级别: 新手上路
可可豆: 128 CB
威望: 128 点
在线时间: 123(时)
发自: Web Page
回 楼主() 的帖子
你是怎么拖出来的 为啥我的和你不一样   已经是 xcode 最新版本了
图片:33.png
级别: 新手上路
可可豆: 2 CB
威望: 2 点
在线时间: 7(时)
发自: Web Page
回 6楼(mflaugh) 的帖子
我的也一样&&
级别: 新手上路
可可豆: 2 CB
威望: 2 点
在线时间: 7(时)
发自: Web Page
回 6楼(mflaugh) 的帖子
直接把这按钮拉到view中就行 不用通过Navigation
级别: 新手上路
可可豆: 2 CB
威望: 2 点
在线时间: 5(时)
发自: Web Page
回 7楼(ouch) 的帖子
我的也一样,解决了吗?
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版}

我要回帖

更多关于 swift3 unwind segue 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信