一整以、通過屬性傳值
先了解下胧辽,在Swift語(yǔ)言中,訪問修飾符有三種公黑,分別為private
邑商,internal
和public
。同時(shí)凡蚜,Swift對(duì)于訪問權(quán)限的控制人断,不是基于類的,而是基于文件的朝蜘。其區(qū)別如下:
private
訪問級(jí)別所修飾的屬性或者方法只能在當(dāng)前的Swift源文件里可以訪問恶迈。
internal
(默認(rèn)訪問級(jí)別,internal修飾符可寫可不寫)
internal訪問級(jí)別所修飾的屬性或方法在源代碼所在的整個(gè)模塊都可以訪問谱醇。如果是框架或者庫(kù)代碼蝉绷,則在整個(gè)框架內(nèi)部都可以訪問,框架由外部代碼所引用時(shí)枣抱,則不可以訪問。如果是App代碼辆床,也是在整個(gè)App代碼佳晶,也是在整個(gè)App內(nèi)部可以訪問。
public:可以被任何人使用
場(chǎng)景一在ViewController中有一個(gè)self.nameTextField.text需要將值傳遞到FirstVC 中讼载。
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è)方法中給新頁(yè)面?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
}
}
2、在 FirstVC 中
class FirstViewController: UIViewController {
var titleNameString :String?
override func viewDidLoad() {
super.viewDidLoad()
print("string === \(self.titleNameString)");
}
二咨堤、通過Delegate傳值
場(chǎng)景: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)然也可以议蟆,通過它的方法我們就一目了然啦
注冊(cè)通知
// 先自定義一個(gè)NSNoticeKey
let MyTestNSNoticeKey = "com.MyYang.testNSNoticeKey"
// 注冊(cè)通知
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è)簡(jiǎn)單的傳值吧咐容,后期慢慢深入。 場(chǎng)景: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語(yǔ)言中函數(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)用。而以上四種方式簡(jiǎn)單的介紹到這里炊琉,它們各有應(yīng)用場(chǎng)景展蒂,我們可以根據(jù)具體的情況下自行選擇吧,優(yōu)缺點(diǎn)用多了就知道了苔咪。