【问题标题】:Passing data on segue to view controller (Swift)将 segue 上的数据传递给视图控制器 (Swift)
【发布时间】:2015-09-09 00:07:19
【问题描述】:

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

    }
}

【问题讨论】:

  • 你的问题是什么?
  • 我很难在最后一个视图控制器中接收数据。 @VictorSigler
  • 我上面的内容并没有设置我在“addParty”@VictorSigler 中的变量
  • 变量是@IBOutlets吗?请将代码分享到您的addParty UIViewController

标签: ios swift segue uistoryboard


【解决方案1】:

您需要覆盖 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

【讨论】:

  • Value of type 'UIViewController' has no member 'dataPassed'
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    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 替换为您的委托类。

    这种方法比通过segues的变化传递对象要好。 实际上,我经常这样做,而且它们的工作方式非常有魅力。

    【讨论】:

    • 谢谢你。我相信这可能是我正在寻找的解决方案。
    • 哈哈,如果你用这种方法,你可以选择我作为答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多