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 文件就可以了.