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

2019-06-22  本文已影响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")
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读