美文网首页
[005]Swift 反向传值的三种方式-设置代理Delegat

[005]Swift 反向传值的三种方式-设置代理Delegat

作者: 快乐捣蛋鬼 | 来源:发表于2019-06-22 17:48 被阅读0次

    一.设置代理Delegate

    将 VC2 的一个值传回到 VC1

    // 设置代理
    class VC1: UIViewController, VC2Delegate{
        
        // (3)设置 VC2 的代理为 VC1
        VC2.vc2delegate = self
        
        // (4)实现代理方法,VC2 调用代理时,会将值传到这里
        func passDataBackToVC1(value: String) {
            print(value) //"DataDataData"
        }
        
    }
    
    // (1)定义一个 protocol
    protocol VC2Delegate: class {
        func passDataBackToVC1(value: String)
    }
    
    class VC2: UIViewController {
        
        // (2)VC2 需要一个代理
        var vc2delegate = VC2Delegate?
        
        
        // (5)VC2 调用代理,并将值传给代理
        func callDelgate() {
            vc2delegate.passDataBackToVC1(value: "DataDataData")
        }
          
    }
    

    二.使用通知Notification

    VC2 发送通知到 VC1

    // 使用通知
    class VC1: UIViewController{
        
        override func viewDidLoad() {
            // (2)注册一个观察者 Observer 接收名为"passDataBack"的消息
            NotificationCenter.default.addObserver(self, selector: #selector(receiveData), name: NSNotification.Name("passDataBack"), object: nil)
            
            
            // (3)收到通知之后可以调用下面的方法,使用消息里的值
            @objc func receiveData(notification: Notification) {
                let data = notification.userInfo?["IntNumber"]
            }
            
        }
        
        deinit {
            // (4)移除接收名为"passDataBack"通知的观察者
            NotificationCenter.default.removeObserver(self, name: NSNotification.Name("passDataBack"), object: nil)
            
        }
     
    }
    
    
    
    class VC2: UIViewController {
        
        override func viewDidLoad() {
            // (1)通知中心发送通知,通知的名称为"passDataBack",通知中包括 一个 “IntNumber”, 其值为5
            NotificationCenter.default.post(name: NSNotification.Name("passDataBack"), object: self, userInfo: ["IntNumber": 5])
        }
        
    }
    

    三.闭包传值

    class VC1: UIViewController {
        
        @IBOutlet weak var showLabel: UILabel!
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "goNext" {
                let vc = segue.destination as! VC2
                
                // (4)使用闭包中的值
                vc.backBlockClosure = { (string: String) -> Void in
                    self.showLabel.text = string
                    
                }
            }
        }
    }
    
    
    
    
    // (1)声明一个闭包类型
    typealias BackBlock = (String) -> Void
    
    class VC2: UIViewController {
        
        // (2)定义一个闭包变量
        var backBlockClosure: BackBlock?
        
        
        @IBAction func clickToPassData(_ sender: UIButton) {
            // (3)调用闭包传值
            self.backBlockClosure!("Label change to Smile")
        }
        
    }
    

    相关文章

      网友评论

          本文标题:[005]Swift 反向传值的三种方式-设置代理Delegat

          本文链接:https://www.haomeiwen.com/subject/eyuvqctx.html