iOS中传值的方式主要有以下几种:
- segue传值
- 通知传值
- 代理传值
- 单例传值
- ShareApplication
- NSUserdefault
如果是A页面传值到B页面,之间有segue连接的话,用属性传值就可以搞定,如果从B页面传值到A页面或者之间没有直接的segue的话,就可以使用代理传值或者单例传值了。
segue传值就是利用segue跳转时利用属性进行传值,这边就不做记录了。
通知是一个单例类,只存在一个通知实例,一个通知会有一个对应的名字,而这个名字就是对应的观察者的接受通知的索引,每个对象都可以接收到这个广播,但是只有这个通知的名字和观察者的名字相同时,对应的观察者才可以接收到这个广播并处理对应逻辑。
//seletor: 接收到通知后应该做的操作;name:该通知对应的名字 //A发送通知 NSNotificationCenter.defaultCenter().postNotificationName("通知名字", object: self, userInfo: ["key": value]) //B接收通知 NSNotificationCenter.defaultCenter().addObserver(self, selector: "接收到通知后要执行的方法:", name: "通知名字", object: nil) //同时实现接受通知后要执行的方法 func 接收到通知后要执行的方法(aNotification:NSNotification){ //value = aNotification.userInfo["key"] } B方 移除监听removeObserver (一定要记得) deinit { NSNotificationCenter.defaultCenter().removeObserver(self) }
|
//声明委托 protocol passValueDele{ func passValue(value:String) } //接受委托,并定义一个委托类的对象: let vc1 = self.storyboard?.instantiateViewControllerWithIdentifier("detail") as! ViewController vc1.delegate1 = self func passValue(value:String){ //得到value之后执行操作 } //在委托类中声明一个委托变量,并调用方法传值; weak var delegate1:passValueDele? //注意用weak,防止循环引用 delegate1?.passValue("value")
|
简单来说单例传值就是创建一个类的单例,各个ViewController共享数据。
先创建一个单例:
class SingleTonClass: NSObject { var value:String? struct singleTon { static var once_t:dispatch_once_t = 0 static var currentDataSong:CurrentDataSong? } class func shareCurrentDataSong()->CurrentDataSong{ dispatch_once(&singleTon.once_t) { () -> Void in singleTon.SingleTonClass = SingleTonClass() } return singleTon.SingleTonClass! } }
|
然后在需要传值的ViewController中给单例的属性赋值;
这样就可以在需要值的ViewController中得到要传的值了;
和单例的原理一样,不过这个单例利用的是AppDelegate;
此方法试用于轻量级的数据转移,就是把需要传的值先存入到NSUserdefault中,然后在需要值的地方从NSUserdefault中取值。