【问题标题】:Sending Variables with a Segue使用 Segue 发送变量
【发布时间】:2015-09-26 02:27:40
【问题描述】:

我正在开发一个简单的 iOS Swift 应用程序。该应用程序有 2 个视图控制器和一个按钮,该按钮已被编程为与另一个视图控制器连接,如下所示:

@IBAction func pushMe(sender: AnyObject) {
        self.performSegueWithIdentifier("changeIt", sender: nil)
}

上述方法有效,但我希望能够从当前视图控制器中保存 2 个变量,并使它们可用于我正在使用的视图控制器。所以我这样做了:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "changeIt" {
        var testVar1 = "Hello"
        var testVar2 = "World"
    }
}

在我继续添加的视图控制器中:

var testVar1:String!
var testVar2:String!

应用程序可以运行,但当我尝试访问 testVar1 或 testVar2 时,应用程序就会崩溃。我不确定为什么这没有按预期工作?

【问题讨论】:

    标签: swift swift2 xcode7


    【解决方案1】:

    因为变量没有初始化,你省略了目标视图控制器。使用下面的代码

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if segue.identifier == "changeIt" {
            let dvc = segue.destinationViewController as! YourDestinationViewController
            dvc.testVar1 = "Hello"
            dvc.testVar2 = "World"
        }
    }
    

    【讨论】:

    • 我现在明白了。感谢您的帮助!
    【解决方案2】:
    if segue.identifier == "changeIt" {
        var testVar1 = "Hello"
        var testVar2 = "World"
    }
    

    您在这里所做的只是创建新的、完全独立的局部变量,称为testVar1testVar2。通过一些神奇的一厢情愿,它们与属于您正在使用的视图控制器的实例属性testVar1testVar2 不同。他们怎么可能?该代码甚至根本没有提到该视图控制器!如果您想设置视图控制器的属性,您需要与该视图控制器交谈

    这样想。假设 Dog 类具有 name 属性,并且您想要设置 Dog 实例的 name。你是这样说的吗?

    let d = Dog()
    let name = "Fido"
    

    不!这会创建一个name,但它不是狗的 名。你需要这样说:

    let d = Dog()
    d.name = "Fido"
    

    所以在您的代码中,您需要使用 segue 来获取 对目标视图控制器的引用并设置 属性。

    【讨论】:

      【解决方案3】:

      您可以在目标 ViewController 上创建变量来解决它

      class OtherViewController : UIViewController {
          var testVar1 : String = ""
          var testVar2 : String = ""
      
          override func viewDidLoad() {
              super.viewDidLoad()
              // Do any additional setup after loading the view, typically from a nib.
      
              var message = "\(self.testVar1) \(self.testVar2)"
              print(message)
          }
      }
      

      UIStoryboardSegue 有一个 destinationViewController 属性。它是您想要到达的端点视图控制器的一个实例。那么现在你可以这样做了:

      class SourceViewController : UIViewController {
      
          //...
      
          override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      
              //Some code before
      
              var destination = segue.destinationViewController as! OtherViewController
              destination.testVar1 = "Hello"
              destination.testVar2 = "World"
      
              //Some code after
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-23
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 2021-12-17
        • 2016-01-15
        相关资源
        最近更新 更多