IOS學習[Swift中跳轉與傳值]


 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM