Swift中頁面跳轉與傳值:
1.簡單方式
首先,Swift的跳轉可分為利用xib文件跳轉與storyboard跳轉兩種方法,我這里選擇使用storyboard的界面跳轉方法。
1、通過在storyboard中拉button控件建立segue跳轉。
2、通過presentViewController方法進行界面跳轉。
這里需要注意presentViewController方法適用於xib與storyboard兩種方法,但是當使用storyboard直接調用該方法時,ios模擬器會轉入一個黑屏界面,程序不會報錯。
主要原因是storyboard制作頁面和手寫頁面,需要使用兩種不同的方法來進行頁面跳轉。
對於storyboard制作頁面:
var sb = UIStoryboard(name: "Main", bundle:nil)
var vc = sb.instantiateViewControllerWithIdentifier("myViewController") as MyViewController
self.presentViewController(vc, animated: true, completion: nil)
對於手寫頁面:
var vc = MyViewController() self.presentViewController(vc, animated: true, completion: nil)
seuge跳轉除了連線方式還有另外一種方法:
performSegueWithIdentifier("SecondSegue", sender: self)
其中利用sugue傳值代碼如下:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var des = segue.destinationViewController as! ViewController
des.label = textF
}
2.利用協議protocol進行傳值
協議protocol指的是在類之間制定一套規定進行委托執行,一個類可以通過協議委托另外一個類執行方法
protocol正向傳值
寫好協議:
protocol ParamsProtocol{
//協議中得方法不能有結構體
func returnParams(tmpStr: String)
}
ViewController:
var paramsProtocolDelegate: ParamsProtocol?
//定義一個方法給協議中得方法賦值
//在viewController中實現方法,這樣在btn1,btn2中就可以不用實現,幫他們2個實現了.這就是代理.
func start(){
self.tmpString = "通過delegate進行的值傳遞方式2"
self.paramsProtocolDelegate?.returnParams(self.tmpString)
}
在NextViewcontroller中:
//遵守協議必須重新實現一下協議中得方法
func returnParams(tmpStr: String) {
self.text2.text = tmpStr
}
override func viewDidLoad() {
super.viewDidLoad()
obj.paramsProtocolDelegate = self
obj.start()
// Do any additional setup after loading the view, typically from a nib.
}
4.利用NSUserDefaults進行傳值
NSUserDefaults能實現小容量的數據存儲功能,常用於用戶名密碼保留等功能上,也可以用來傳值。
創建一個工具類:
import Foundation
//工具類,放置一些經常用到的方法
//通過userDefault存儲數據
class baseClass{
func cacheSetString(key: String,value: String){
let userInfo = NSUserDefaults()
userInfo.setValue(value, forKey: key)
}
func cacheGetString(key: String) -> String{
let userInfo = NSUserDefaults()
let tmpSign = userInfo.stringForKey(key)
return tmpSign!
}
}
ViewController:
var base: baseClass = baseClass()
}
@IBAction func btn3Click(sender: AnyObject) {
self.base.cacheSetString("sign", value: "通過NSUserDefaults傳遞方式3")
self.performSegueWithIdentifier("btn3", sender: self)
}
NextViewController:
@IBOutlet weak var text3: UITextField!
var base: baseClass = baseClass()
var sign:String = String()
override func viewDidLoad() {
super.viewDidLoad()
self.sign = base.cacheGetString("sign")
text3.text = self.sign
// Do any additional setup after loading the view, typically from a nib.
}
補充兩種:
4. 利用 self.storyboard
利用 self.storyboard 方法, 就不需要進行 連線, 一樣可以進行視圖之間的跳轉. 但是必須要設置 Storyboard ID.
然后利用 如下方法進行 跳轉 和 傳值
var thirdVC = self.storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as ThirdViewController
thirdVC.text = "Pass"
self.navigationController?.pushViewController(thirdVC, animated: true)
因為是在 同一個 Storyboard 里面進行跳轉, 所以 self.storyboard 就可以滿足需求.
不明白? 看最后一個方法:
5. 利用 UIStoryboard
XIB 方法, 我們需要 用到 nibName, 同樣 如果我們想要 分離多個 sence 在不同的Storyboard 里面, 怎么辦?
這個時候, 就不能使用 self.storyboard 了.
而是:
var storyboard = UIStoryboard(name: "New", bundle: nil)
var newVC = storyboard.instantiateViewControllerWithIdentifier("NewViewController") as NewViewController
newVC.text = "Pass"
self.navigationController?.pushViewController(newVC, animated: true)
是不是 和 XIB 有異曲同工的感覺, 這樣就可以把 Storyboard 分幾個, 每個里面放幾個 Sence.
這樣的好處就是, 當你需要做多個不同功能的模塊的應用, 分離到不同的 Storyboard 中, 彼此互不影響.
相對於 XIB 來說, 每個文件夾 只需要 1 個 Storyboard 文件, 和 Swfit 文件就可以了.
