代理
1.設置代理方法
@objc protocol ViewDelegateControllerDelegate {
// 必定實現(xiàn)的方法
func textFieldIsText(_ string : String?)
// 可選實現(xiàn)的方法
@objc optional
func textFieldHasText(_ string : String?)
}
2.設置代理
// 在 當前類 設置參數(shù)的地方
// 代理屬性應該為 weak 類型, 避免無法被釋放出現(xiàn)問題
weak var delegate : ViewDelegateControllerDelegate?
3.在指定的地方讓代理實現(xiàn)方法
if (self.delegate != nil) {
self.delegate?.textFieldHasText!(self.textField?.text)
}
if (self.delegate != nil){
self.delegate?.textFieldIsText(self.textField?.text)
}
4.1 實現(xiàn)方 -->遵守協(xié)議
class ViewController: UIViewController,ViewDelegateControllerDelegate
4.1 實現(xiàn)方 -->設置代理
let vc = ViewDelegateController()
vc.delegate = self
4.3 實現(xiàn)方法 --> 完成代理方法
// 可選實現(xiàn)
func textFieldHasText(_ string: String?) {
if string != nil {
textLabel?.text = string
}
}
// 必定實現(xiàn)
func textFieldIsText(_ string: String?) {
print(string ?? "")
}
通知
1.發(fā)送通知
// 將一個 字典 廣播出去
var dict : [String : Any] = [String : Any]()
dict["id"] = 123
dict["name"] = "textName"
dict["avatar"] = "https://www.xxxx.png"
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ViewNotificationTextDidBack"), object: nil, userInfo: dict)
2.在需要接受廣播的地方 添加 通知
// 通知名稱 和 發(fā)送 通知的名稱保持一致
NotificationCenter.default.addObserver(self, selector: #selector(textDidNotificateBack(_:)), name: NSNotification.Name(rawValue: "ViewNotificationTextDidBack"), object: nil)
3.實現(xiàn) 添加廣播的方法
@objc func textDidNotificateBack(_ dict: Notification){
let name = dict.name._rawValue
let userInfo : [String : Any] = dict.userInfo as! [String : Any]
print(name,userInfo) // ViewNotificationTextDidBack ["id": 123, "name": "textName", "avatar": "https://www.xxxx.png"]
}
4.當控制器 銷毀的時候
deinit {
// 注意 : 這里是 移除所有的通知, 也可以移除指定的通知
NotificationCenter.default.removeObserver(self)
// NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "ViewNotificationTextDidBack"), object: nil)
}
閉包
1.聲明閉包
// 傳遞一個 Int類型的無返回值的 閉包
var finishCallBack : ((_ index : Int) -> ())?
2.在指定的地方調(diào)用 閉包
if self.finishCallBack != nil {
self.finishCallBack?(123)
}
3.在上一個界面 開始 調(diào)用閉包
let blockVc = ViewBlockController()
blockVc.finishCallBack = {(_ index) in
print(index) // 123
}