将segue上的数据传递给视图控制器(Swift)

时间:2015-09-09 00:07:20

标签: ios swift segue uistoryboard

我想将数据传递给名为“addParty”的视图控制器。为了说明这一点,我的应用程序来自A - > B - > C - > D. A到C是接收用户信息的设置页面。这些页面后跟D,即“addParty”,我希望传递A到C的所有数据。

下面是我到目前为止用视图控制器A到C做的事情的一个例子。

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
    if (segue.identifier == "Setup1Segue") {


        var DestViewController: addToParty = segue.destinationViewController as! addToParty
            // path the cell's content to your detailViewController
            DestViewController.PartyName = etPartyName.text!
            DestViewController.Address = etAddress.text!
            DestViewController.City = etCity.text!
            DestViewController.State = etState.text!
            DestViewController.Zip = etZip.text!

    }
}

3 个答案:

答案 0 :(得分:4)

您需要在ViewController中覆盖'prepareForSegue'方法。

在你的 FirstViewController.swift 中定义了显示SecondViewController的任何动作,在这个ViewController(SecondViewControler.swift)中你需要声明你将收到的变量FirstViewController.swift

FirstViewController.swift

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "btnSubmitSencondViewController") {
    var svc = segue.destinationViewController as SecondViewController;
    svc.dataPassed = fieldA.text
    svc.secondDataPassed = fieldB.text
 }
}

最后!在我们的第二个视图控制器类文件(SecondViewController.swift)中,我们需要在调用viewDidLoad时将变量分配给显示标签。这很简单,只需查看覆盖功能viewDidLoad()并输入以下代码。

labelA.text = dataPassed
labelB.text = secondDataPassed

答案 1 :(得分:1)

您可以使用所有视图控制器通用的类,并将您的详细信息保存到此公共类变量中。

  1. 首先创建一个名为PartyDetails的新swift文件

    import Foundation
    
    class PartyDetails {
    
     class var sharedInstance: PartyDetails {
       struct Static {
        static var instance: PartyDetails?
        static var token: dispatch_once_t = 0
      }
    
     dispatch_once(&Static.token) {
        Static.instance = PartyDetails()
     }
    
       return Static.instance!
     }
    
     var partyName: String?
     var address: String?
     var city: String?
     var state: String?
     var zip: Int?
    

    }

  2. 然后在ViewControllers A,B,C中输入此代码

  3. 例如: -

    class A: UIViewController{
    
    
     let partyInfo = PartyDetails.sharedInstance
    
      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        if segue.identifier == "Setup1Segue" {
            let jobDetailViewController = segue.destinationViewController as! B
    
                self.partyInfo.partyName = label1.text // save your info
                self.partyInfo.address = label2.text // save your info
    
             }
         }
    
      }
    }
    
    1. 然后在D级使用这样,

      class D: UIViewController {
      
       var partyInfo = PartyDetails.sharedInstance
      
        override func viewDidLoad() {
      
          super.viewDidLoad()
      
         myLabel1.text = self.partyInfo.partyName
         myLabel2.text = self.partyInfo.address
         }
       }
      

答案 2 :(得分:1)

如果信息非常重要,您需要确保可以在整个应用中访问该信息,您可以将变量放在应用代理中

首先,制作像这样的自定义类

import Foundation

class PartyDetails: NSObject
{
    var partyName: String? = nil
    var address: String? = nil
    var city: String? = nil
    var state: String? = nil
    var zip: Int? = nil
}

在您的app appate中现在声明一个变量

var partyDetails: PartyDetails! = nil

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    // Override point for customization after application launch.

    loadPartyDetailsOrInitializeHere()
    return true
}

现在,您可以通过以下代码引用它来访问视图控制器中任何位置的partyDetails对象

var partyDetails = (UIApplication.sharedApplication().delegate as! YOUR_APP_DELEGATE_CLASS_HERE).partyDetails

您必须将YOUR_APP_DELEGATE_CLASS_HERE替换为您的委托类。

这种方法比使用segue的变化传递对象更好。 实际上我经常这样做,他们的工作就像一个魅力。