iOS 传值总结

iOS中传值的方式主要有以下几种:

  • segue传值
  • 通知传值
  • 代理传值
  • 单例传值
  • ShareApplication
  • NSUserdefault

如果是A页面传值到B页面,之间有segue连接的话,用属性传值就可以搞定,如果从B页面传值到A页面或者之间没有直接的segue的话,就可以使用代理传值或者单例传值了。

  • 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中得到要传的值了;

  • ShareAppDelegate传值

和单例的原理一样,不过这个单例利用的是AppDelegate;

  • NSUserdefault传值

此方法试用于轻量级的数据转移,就是把需要传的值先存入到NSUserdefault中,然后在需要值的地方从NSUserdefault中取值。