在我們開發(fā)中傳值的方式有很多種,下面簡單記錄下我們常用的傳值方式搪花,像屬性傳值遏片,代理,通知鳍侣,閉包等等丁稀。
一、通過屬性傳值
先了解下倚聚,在Swift語言中线衫,訪問修飾符有三種,分別為private
惑折,internal
和public
授账。同時(shí),Swift對(duì)于訪問權(quán)限的控制惨驶,不是基于類的白热,而是基于文件的。其區(qū)別如下:
-
private
訪問級(jí)別所修飾的屬性或者方法只能在當(dāng)前的Swift源文件里可以訪問粗卜。 -
internal
(默認(rèn)訪問級(jí)別屋确,internal
修飾符可寫可不寫)
internal
訪問級(jí)別所修飾的屬性或方法在源代碼所在的整個(gè)模塊都可以訪問。如果是框架或者庫代碼续扔,則在整個(gè)框架內(nèi)部都可以訪問攻臀,框架由外部代碼所引用時(shí),則不可以訪問纱昧。如果是App代碼刨啸,也是在整個(gè)App代碼,也是在整個(gè)App內(nèi)部可以訪問识脆。 -
public
:可以被任何人使用
場景在ViewController中有一個(gè)self.nameTextField.text需要將值傳遞到FirstVC 中设联。
1-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) //在這個(gè)方法中給新頁面?zhèn)鬟f參數(shù) override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "VCGoToFirstIden"{ let controller = segue.destinationViewController as! FirstViewController controller.titleNameString = sender as? String } }
1-2、在 FirstVC 中
class FirstViewController: UIViewController {
var titleNameString :String?
override func viewDidLoad() {
super.viewDidLoad()
print("string === \(self.titleNameString)");
}
二离例、通過Delegate傳值
場景:ViewController 進(jìn)入FirstVC 后换团,返回值到ViewController中。
在FirstVC中
// 定義協(xié)議內(nèi)容
protocol FirstVCChangedTheValueDelegate{
// 回調(diào)方法
func sendValueToLastVC(msgString:String)
}
class FirstViewController: UIViewController {
// 為什么 沒有當(dāng)初的 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 {}
// 進(jìn)入FisrtVC的時(shí)候
firstVC.delegate = self
// MARK: 實(shí)現(xiàn)代理
func sendValueToLastVC(msgString: String) {
print("我收到了\(msgString)")
}
三啥寇、通過NSNotificationCenter傳值
通知這塊的話偎球,通知干某個(gè)事情相對(duì)來說洒扎,具體的傳值的當(dāng)然也可以,通過它的方法我們就一目了然啦
注冊通知
// 先自定義一個(gè)NSNoticeKey
let MyTestNSNoticeKey = "com.MyYang.testNSNoticeKey"
// 注冊通知
NSNotificationCenter .defaultCenter() .addObserver(self, selector: "addTestNoticeMethod:", name: MyTestNSNoticeKey, object: nil)
func addTestNoticeMethod(notice: NSNotification){
print("收到通知了==\(notice.userInfo)")
// 所需要的值就可以在這里收到了
}
發(fā)送通知
NSNotificationCenter .defaultCenter().postNotificationName(MyTestNSNoticeKey, object: self,userInfo: ["one":"1"])
記得及時(shí)移除通知
deinit{
NSNotificationCenter .defaultCenter() .removeObserver(self)
}
四衰絮、通過閉包(Closure)傳值
閉包這塊有點(diǎn)難懂袍冷,先記錄一個(gè)簡單的傳值吧,后期慢慢深入猫牡。 場景:ViewController 到 FirstVC ,然后反向傳值回來胡诗。
在FirstVC
//類似于OC中的typedef
typealias getMyValueClosure = (myValueString:String)->Void
// 聲明一個(gè)閉包
var myClosure :getMyValueClosure?
然后只要再返回的時(shí)候然眼,或者說某個(gè)觸發(fā)事件上處理下
if (self.myClosure != nil){
self.myClosure!(myValueString: "我要傳的值")
}
在ViewController
// 數(shù)據(jù)回傳函數(shù)
func myClosureMethod(testStr:String)->Void{
//這句話什么時(shí)候執(zhí)行勺三?吴攒,閉包類似于oc中的block或者可以理解成c語言中函數(shù)灾炭,只有當(dāng)被調(diào)用的時(shí)候里面的內(nèi)容才會(huì)執(zhí)行
print("Block 傳值了==:\(testStr)")
}
進(jìn)去FirstVC 的時(shí)候注意加上
// 這里把對(duì)象的指針傳到第二個(gè)ViewController中
// 在第二個(gè)ViewController中就可以間接控制這個(gè)對(duì)象了
controller.myClosure = myClosureMethod
另外像單例运授,NSUserDefaults也可以當(dāng)做傳值運(yùn)用贱案。而以上四種方式簡單的介紹到這里暇榴,它們各有應(yīng)用場景举户,我們可以根據(jù)具體的情況下自行選擇吧器联,優(yōu)缺點(diǎn)用多了就知道了二汛。