多MVC设计模式
IOS中提供了几个Controller,它们使用其他MVC作为视图:
UITabBarController,UISplitViewController,UINavigationController,在这几个Controller里
UINavigationController就像咱们iPhone里的设置菜单那样,是一个栈来实现的,你每点击一个选项,一个新的MVC就会来到栈顶,顶部栏的返回按钮是自动放在那里的,点击 以后会使得栈顶的MVC被移除。
创建这些一般通过在StoryBoard中拖拽出这几个Controller然后通过Ctrl加拖拽来创建他们和其他视图的关系
Segues
他负责从一个View转换到另一个View,有四种默认的:Show Segue, Show Detital Segue, Modal Segue, Popover Segue
创建Segues同样是通过将负责跳转操作的按钮或空间使用Ctrl加拖拽的办法拖到需要跳转的View上,一定要记得设置Id,这是唯一表示你的Segues的字符串。
连接好以后就要做跳转View的准备工作了,准备工作要在跳转前的View里做,复写一个方法即可
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { //首先判断是不是要跳转到HappinessViewController的segue if let happinessViewController = segue.destinationViewController as? HappinessViewController { //然后再判断是哪一个id的segue if let identifier = segue.identifier { switch identifier { case "sad": happinessViewController.happiness=0 //一开始执行上面被注释掉的语句会崩溃,因为将这个值赋给happiness时调用了faceView的重绘方法(faceView.setNeedsDisplay())。 //而faceView这个OutLet是在HappinessViewController里定义的,在做这段准备时它并没有被定义。 //不过如果你将faceView放在一个Optional链里这个问题就很好解决了,当faceView为nil时,整句话不会报错,只是返回一个nil。(faceView?.setNeedsDisplay()) case "meh": happinessViewController.happiness=50 case "happy": happinessViewController.happiness=100 default: break } } } }也可以直接从代码里创建,不过还是需要从StoryBoard里先定义一个segue,这次直接从View顶上的图标中的黄色小圆点拖,在需要执行的地方写上这句话:
performSegueWithIdentifier("nothing", sender: self)准备还是在上面的函数里准备,加一个case。
Popover
与其他的segue一样,主要的区别是你需要调节一下大小,默认的话在iPhone上会充满整个屏幕而无法退回
if let ppc = tvc.popoverPresentationController { ppc.delegate = self }在segue的准备函数中将自己设置为代理,并声明自己实现UIPopoverPresentationControllerDelegate这个协议,并实现下面的方法:
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { return UIModalPresentationStyle.None }