Multiple MVCs
UITabBarController
//只有一个属性tabBar中
var tabBarItem: UITabBarItem!
tabBarIten中有title,icon等
UISplitViewController 包含两个MVC
左边的MVC叫做split view的Master
右边的MVC叫做Detail
UINavigationController
可以包含任何一个MVC类似设置界面
title bar显示标题还可以放置一些图标
工作就为一个堆栈,点击一个mvc就进入一个新的MVC,然后返回就把栈中的MVC移除返回上一层操作
有一个特殊属性 outlet 指向某个MVC是指向某个MVC的控制器
所有Controller中都有一个属性叫viewControllers它是由UIViewController组成的一个数组
var viewControllers: [UIViewcontrolle] {get set}//用于存储controllers
获取到一个viewControllers
var tabBarController: UITabBarController? {get}
var splitViewController: UISplitViewController? {get}
var navigationController: UINavigationController? {get}
for example get the detail of the split view controller
if let detailVC: UIViewController = splitViewController?.viewController[1]{…}
Segues是如何从一个View Controller转换到另一个View Controller
四中基本Segues
Show Segues展示正在交互的那个MVC基本是在Navigtion Conroller中使用到
Show detail segues 与上一个很相似,唯一的区别是在Detail中显示MVC
Popover Segue弹出Segue的目标View Controller,并让这个View Controller显示在所有其他东西之上.并不是整个屏幕只是一小块区域,如果用户点击了区域外则这个View就会消失,尽管他不是铺满整个屏幕,但是你可以让窗口背后的用户额面变灰变暗
model
都会创建一个新的MVC
MVC实现了一个方法,叫做prepareForeSegue在里面,它存着刚刚创建出来的MVC
func prepareForSegue(segue:UIStroyboardSegue,sender: AnyObject?) {
if let identifier = segue.identifier {
switch identifier {
case “Show Graph”:
if let vc = segue.detinationViewController as? MyController {
vc.property1 = ..
vc.callMethodToSetItUp(…)
}
default:break
}
}
}
第一个segue UIStoryboardSegue的实例,这个实例里有两个相当重要的东西.一个是identifier这能让你知道 在准备那一个segue
第二个是这个segue发生时新建的那个MVC名字叫destinationViewController
因为split view controller不能在普通IPHONE上运行.所以需要添加Navigation Controller
当准备segue的时候.outlet还没有设置,会抛异常
因为在运行到使用outlet的时候MVC还没对他进行设置赋值,所以当时的outlet还是为nil的值.一个为nil的值进行调用方法就是一个错误.必须注意.以后这类事情最好先设置为?的或者检查是否为nil在进行做后面的事
Popover
Popover不是一个UIViewController它是通过一个叫做PresentationControlleri出现在屏幕上的
一个解决方法就是在outlet调用处为?可选值意思为如果这个为nil就不执行后面的方法等
PresentationController的delegate非常有趣可以调整popver以在iPhone上适配
iPad会有小窗口等效果
iPhone称为了modal 全屏模式
func prepareForSegue(segue: UIStoryboardSegue, sender:AnyObejct) {
if let identifier = segue.dentifier {
switch identifier {
case “Do Something in a Popover Segue”:
if let vc = segue.destnationViewController as? MyController{
if let ppc = vc.popoverPresentationController{
ppc.permittedArrowDirections = UIPopoverArrowDirection.Any
ppc.delegate = self
}
}
default:break
}
}
}
对于dalegate可以实现协议中
delegate的协议要实现UIPopoverPresentationControllerDelegate
//当popover将要弹出来的时候.
//这个方法说明不让iPhone适配POpover不然会占满一个屏幕
func adaptivePresentationStyleForPresentationController(UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.None //(不要 default is .FullScreen)
}
func presentationController(UIPresentationController,viewControllerForAdaptivePresentationStyle: UIModalPresentationStyle) -> UIViewController? {
// return a UIViewController to use(e.g. wrap a Navigation Controller around your MVC)
}
Popover size
var preferredContentSize: CGSize
子类中可以重写父类的这个属性
UserDefaults
NSUserDefaults.standarUserDefaults();
会返回一个userdefaults 靠他读取或写入 NSUserDefaults
UIViewController中有个属性为
presentingViewController是通过ViewController通过某种segue正在屏幕中显示的ViewController 也可以拿来检测viewcontrooler中有没有文字等