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

Passing data on segue to view controller (Swift)

我想将数据传递给名为 "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!

    }
}

您需要覆盖 ViewController 中的“prepareForSegue”方法。

在您的 FirstViewController.swift 中定义了要显示第二个的任何动作ViewController 并且在这个 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
 }
}

终于!在我们的第二个视图控制器 class 文件 (SecondViewController.swift) 中,我们需要在调用 viewDidLoad 时将变量分配给显示标签。这很简单,只需查找 override func viewDidLoad() 并输入下面的代码。

labelA.text = dataPassed
labelB.text = secondDataPassed

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

  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 中放入这段代码

例如:-

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. 然后在classD中这样使用,

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

如果信息非常重要并且您需要确保它可以在整个应用程序中访问,您可以将变量放在应用程序委托中

首先,像这样

定制class
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
}

现在在您的应用委托中声明一个变量

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 替换为您的代表 class 是什么。

这种方法比通过 segue 的变化传递对象要好。 其实我经常这样做,而且效果很好。