屬性傳值:
顧名思義弟翘,常用的就是從前往后傳值虫腋;屬性傳值一共分為三步:
1、定義一個(gè)要與傳值數(shù)據(jù)類型相同的屬性
2稀余、給屬性賦值
3悦冀、取出屬性中的值
// 隨便寫的一個(gè)方法
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//同OC一樣,首先給要跳轉(zhuǎn)到的頁面初始化
let pushVC = PushViewController()
//str: 下個(gè)界面的屬性睛琳,將"屬性傳值" 這個(gè)字符串傳到下個(gè)界面
pushVC.str = "屬性傳值"
//跳轉(zhuǎn)
self.navigationController?.pushViewController(pushVC, animated: true)
}
跳轉(zhuǎn)到改界面
class PushViewController: UIViewController {
//屬性傳值
//此處定義的str盒蟆,為的是在上個(gè)界面跳轉(zhuǎn)的時(shí)候要傳的屬性
var str: String!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
print("str:=====\(str)")
}
}
屬性傳值
代理傳值:
1、定義協(xié)議
2师骗、定義代理屬性
3历等、代理對象所在類遵循協(xié)議
4、代理對象所在類遵循協(xié)議
5辟癌、代理對象所在類實(shí)現(xiàn)協(xié)議中的方法
6寒屯、通知代理對象干活
//代理傳值1:
//首先定義一個(gè)協(xié)議
protocol PushViewControllerDeleget {
//需要遵守的協(xié)議方法
func sendValue(text:String)
}
//代理傳值2:
//此處可以理解為OC中的(@property(nonatomic,weak) id<PushViewControllerDeleget>delegate;)
var delegate: PushViewControllerDeleget!
//代理傳值3
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
//此行代碼可以理解為在OC中的:
/**
if ([self.delegate respondsToSelector:@selector(sendValue:text)]) {
[self.delegate sendValue:text];
}
*/
self.delegate.sendValue(text: "代理傳值")
self.navigationController?.popViewController(animated: true)
}
//代理傳值4:
//跟OC一樣,想讓誰遵守協(xié)議黍少,就寫在哪里(注意是用","分開)
class HomeViewController: UIViewController, PushViewControllerDeleget { }
//代理傳值5
class HomeViewController: UIViewController, PushViewControllerDeleget {
/** 注意:遵守的協(xié)議方法要寫在這里寡夹,寫在" viewDidLoad "里面是報(bào)錯(cuò)的 */
// 定義一個(gè)label,假如傳值給label
var lable = UILabel()
//遵守協(xié)議方法:sendValue
func sendValue(text: String) {
//text:為傳過來的值厂置,將text的值 賦值給lable.text
lable.text = text
print(lable.text!)
}
}
代理傳值
閉包傳值
從后往前傳值
1菩掏、定義一個(gè)閉包屬性
2、在前一個(gè)界面為閉包屬性賦值
3昵济、在pop回去之前調(diào)用閉包
//閉包傳值1:
//定義一個(gè)閉包
var value: ((String) ->())!
//閉包傳值2:
let pushVC = PushViewController()
pushVC.value = { (text: String) in
// 取出參數(shù)智绸,為前一個(gè)界面的賦值
self.lable.text = text
print(self.lable.text!)
}
//閉包傳值3:
self.value("閉包傳值")
閉包傳值
NotificationCenter傳值
注意:Swift3.0之后野揪,這里不再是NSNotificationCenter了,方法變動很大传于。
通知使用步驟:注冊通知 -> 發(fā)送通知 -> 移除通知
- 注冊通知
//注冊成為觀察者
//參數(shù)1:觀察者對象
//參數(shù)2:消息中心發(fā)送消息的時(shí)候觀察者會自動調(diào)用的方法對應(yīng)的selector(觀察者接收到消息后會調(diào)用的方法)-->必須帶一個(gè)參數(shù)囱挑,并且參數(shù)的類型是NSNotification
//參數(shù)3:觀察者要觀察的消息的名字
NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "notifyName"), object: nil, queue: OperationQueue.main) { (note) in
//這里拿到通知傳來的數(shù)據(jù)text,然后進(jìn)行邏輯處理, 我們這里只是打印傳過來的內(nèi)容
print("\(String(describing: note.userInfo?["text"])))")
}
- 發(fā)送通知
//使用消息中心發(fā)送消息(消息的內(nèi)容就是要傳的值)
//a.拿到消息中心(單例對象)NotificationCenter.default
//b.發(fā)送消息
//NSNotification.Name(rawValue:"notifyName") 消息名,Swift3.0之后的寫法
//userInfo:要發(fā)送的消息的內(nèi)容
NotificationCenter.default.post(name: NSNotification.Name(rawValue:"notifyName"), object: self, userInfo: ["text":"這是一個(gè)通知"])
- 移除通知
deinit {
//方式1:直接self
NotificationCenter.default.removeObserver(self)
//方式2:移除指定的名字notifyName
//NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "notifyName"), object: nil)
}
通知傳值
到這里,常用的幾種傳值的簡單使用就介紹完了沼溜。
代碼:https://github.com/Baiyongyu/Swift-RootController.git