一、通过属性传值
先了解下,在Swift语言中,访问修饰符有三种,分别为private
,internal
和public
。同时,Swift对于访问权限的控制,不是基于类的,而是基于文件的。其区别如下:
private
访问级别所修饰的属性或者方法只能在当前的Swift源文件里可以访问。
internal
(默认访问级别,internal修饰符可写可不写)
internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
public:可以被任何人使用
场景一在ViewController中有一个self.nameTextField.text需要将值传递到FirstVC 中。
1、在ViewController中
storyboard获取FirstVC
let storyboard = UIStoryboard(name: "Main", bundle:nil)
let firstVC = storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as! FirstViewController
firstVC.titleNameString = self.nameTextField.text
self.navigationController?.pushViewController(firstVC, animated: true)
Segue 获取FirstVC
self .performSegueWithIdentifier("VCGoToFirstIden", sender: self.nameTextField.text)
//在这个方法中给新页面传递参数
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "VCGoToFirstIden"{
let controller = segue.destinationViewController as! FirstViewController
controller.titleNameString = sender as? String
}
}
2、在 FirstVC 中
class FirstViewController: UIViewController {
var titleNameString :String?
override func viewDidLoad() {
super.viewDidLoad()
print("string === \(self.titleNameString)");
}
二、通过Delegate传值
场景:ViewController 进入FirstVC 后,返回值到ViewController中。
在FirstVC中
// 定义协议内容
protocol FirstVCChangedTheValueDelegate{
// 回调方法
func sendValueToLastVC(msgString:String)
}
class FirstViewController: UIViewController {
// 为什么 没有当初的 weak 呢?
var delegate:FirstVCChangedTheValueDelegate?
// 返回按钮回去的方法
@IBAction func backUpVC(sender: AnyObject) {
if (self.delegate != nil) {
self.delegate?.sendValueToLastVC("passwordBackString")
}
navigationController?.popToRootViewControllerAnimated(true)
}
}
在ViewController 中
class ViewController: UIViewController,FirstVCChangedTheValueDelegate {}
// 进入FisrtVC的时候
firstVC.delegate = self
// MARK: 实现代理
func sendValueToLastVC(msgString: String) {
print("我收到了\(msgString)")
}
三、通过NSNotificationCenter传值
通知这块的话,通知干某个事情相对来说,具体的传值的当然也可以,通过它的方法我们就一目了然啦
注册通知
// 先自定义一个NSNoticeKey
let MyTestNSNoticeKey = "com.MyYang.testNSNoticeKey"
// 注册通知
NSNotificationCenter .defaultCenter() .addObserver(self, selector: "addTestNoticeMethod:", name: MyTestNSNoticeKey, object: nil)
func addTestNoticeMethod(notice: NSNotification){
print("收到通知了==\(notice.userInfo)")
// 所需要的值就可以在这里收到了
}
发送通知
NSNotificationCenter .defaultCenter().postNotificationName(MyTestNSNoticeKey, object: self,userInfo: ["one":"1"])
记得及时移除通知
deinit{
NSNotificationCenter .defaultCenter() .removeObserver(self)
}
四、通过闭包(Closure)传值
闭包这块有点难懂,先记录一个简单的传值吧,后期慢慢深入。 场景:ViewController 到 FirstVC ,然后反向传值回来。
在FirstVC
//类似于OC中的typedef
typealias getMyValueClosure = (myValueString:String)->Void
// 声明一个闭包
var myClosure :getMyValueClosure?
然后只要再返回的时候,或者说某个触发事件上处理下
if (self.myClosure != nil){
self.myClosure!(myValueString: "我要传的值")
}
在ViewController
// 数据回传函数
func myClosureMethod(testStr:String)->Void{
//这句话什么时候执行?,闭包类似于oc中的block或者可以理解成c语言中函数,只有当被调用的时候里面的内容才会执行
print("Block 传值了==:\(testStr)")
}
进去FirstVC 的时候注意加上
// 这里把对象的指针传到第二个ViewController中
// 在第二个ViewController中就可以间接控制这个对象了
controller.myClosure = myClosureMethod
另外像单例,NSUserDefaults
也可以当做传值运用。而以上四种方式简单的介绍到这里,它们各有应用场景,我们可以根据具体的情况下自行选择吧,优缺点用多了就知道了。
网友评论