标签:ios8 swift segue prepareforsegue performseguewithiden
上一话我们对Demo的选择界面做了自动布局的相关处理,现在开始连接多个MVC的操作。首先我们需要其他工程中的文件,那么让我们打开另一个app。点击下面这个文件
然后拖动我们需要的文件到新的工程目录下:
注意勾选第一行,不然只是做了引用,如果你不小心删除了目标目录的话,你就找不到这些文件了,所以还是推荐做复制,这样会把文件复制到我们自己的工程目录下。
那么storyboard中的内容怎么办呢,我们只需要在原工程的storyboard中选中控制器然后复制,粘贴到新工程的storyboard中即可。
我注意到一个问题,当我复制粘贴过来的时候控制器中的脸没有了。看起来需要一些触发的小动作。我们来到FaceView中做一些小修改然后回退再保存就好了。
看,现在出来了。现在把这两个MVC添加到分栏控制器中,别忘了把左侧的小箭头移到分栏控制器中,具体做法我们之前已经介绍过了,这里就不啰嗦了,直接看结果:
我们在ip6 plus上运行一下,如果是竖屏你会看到:
跟其他尺寸的iphone一样,即便你左右滑动也不会出现笑脸,但是如果你横屏的话会看到:
这和ipad上的效果是相同的,我们之前讲过ip6 plus比较特殊,虽然屏幕小但是清晰度很高,在横屏模式下和ipad是一样的,关于自动布局的东西以后会细讲。
在我们继续下面的工作前需要修改storyboard以适应iphone,之前讲过我们在master上Embed in一个导航控制器,现在在iphone6上运行你会看到初始界面变成:
点击返回就可以回到选择界面,如果你在导航栏上加了一个标题,storyboard中会出现警告,原因是我们新加的导航栏会挡住之前的label,依旧update frame就好了。现在我们把master和detail关联起来。我们使用segue,之前讲过了拖拽按钮到小人脸的控制器上然后选择show detail,三个按钮都做重复的动作,三个segue分别命名为sad 、happy、meh(即不开心也不难过)。
现在你在iphone上运行可以看到点击按钮页面发生跳转了,说明segue生效了,但是小人脸的表情并没有发生变化,因为我们还没有准备segue,回忆一下之前讲的。
回到PsychologistViewController的代码中,我们在这个代码中所需要做的就是为segue做准备。
import UIKit class PsychologistViewController: UIViewController { override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if let hvc = segue.destinationViewController as? HappinessViewController,let identifier = segue.identifier{ switch identifier{ case "sad":hvc.happiness = 0 case "happy":hvc.happiness = 100 default:hvc.happiness = 50 } } } }
你会看到faceView是空值。回顾一下之前的代码,我们刚才修改了happiness的值,来看看happiness的属性观察器:
var happiness:Int = 75 {//0代表伤心,100代表开心 didSet{ happiness = max(min(happiness, 100), 0) println("happiness = \(happiness)") updateUI() } }
这就是我们之前讲过的,outlet在segue的时候还没有初始化。
那么如何解决这个问题呢?幸运的是当我们想要修改模型的值时会更新页面的内容,如果这个时候页面的outlet没有值的话,只要忽略就好了。很简单的做法,我们把可能为空的值放入可选链中:
func updateUI(){ faceView?.setNeedsDisplay() }
然后在updateUI这个方法中增加一行:
func updateUI(){ faceView?.setNeedsDisplay() title = "\(happiness)" }
这也是我们之前讲的,当你增加了一个导航控制器后,所有的segue都指向了导航控制器,而不再是detail本身了:
那么如何修改呢?
import UIKit class PsychologistViewController: UIViewController { override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { var destination = segue.destinationViewController as? UIViewController if let navCon = destination as? UINavigationController{ destination = navCon.visibleViewController } if let hvc = destination as? HappinessViewController,let identifier = segue.identifier{ switch identifier{ case "sad":hvc.happiness = 0 case "happy":hvc.happiness = 100 default:hvc.happiness = 50 } } } }
之前的segue都是我们通过storyboard中实现的,现在让我们来试试如何通过代码来实现,我们新加一个按钮取名Noting!然后通过页面间的拖动来产生segue。我们选中master控制器上方的黄色按钮
拖拽到detail的导航控制器中松手选择show detail。取名为nothing,然后我们打开联合视图拖动nothing按钮到控制器代码中生成一个action,action代码如下:
@IBAction func nothing(sender: UIButton) { performSegueWithIdentifier("nothing", sender: nil) }
case "nothing":hvc.happiness = 25
那么我们为什么要在代码中使用segue呢,你可能在按钮被点击之后需要根据一些状态来判断使用哪个segue,这是在代码中使用segue的经典理由。
【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记23 多MVC模式Demo的实现
标签:ios8 swift segue prepareforsegue performseguewithiden
原文地址:http://blog.csdn.net/cg1991130/article/details/45131661