【问题标题】:prepareForSegue function not workingprepareForSegue 功能不起作用
【发布时间】:2023-03-13 08:37:01
【问题描述】:

我确信我有两个视图控制器,它们有适当的文件作为它们的类。 (ViewController1.swift 和 ViewController2.swift)我正在尝试使用以下代码将数据从一个视图控制器传递到另一个视图控制器;但我收到错误“UIView Controller 无法转换为 ViewController2”。我该怎么办?我试图改变 as !和 var 让;都没有用。

   override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!){

        if (segue.identifier == "btnSubmitSegue") {
        var svc = segue.destinationViewController as ViewController2;
        svc.DataPassed = textField.text

    }
}

ViewController2 的代码 导入 UIKit

 class ViewController2: UIViewController {

var toPass: String = ""
 @IBOutlet weak var labeld: UILabel!



override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

      self.labeld.text = "passed: \(self.toPass)"

}




override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
}

ViewController1 的代码

  import UIKit

  class ViewController1: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



@IBOutlet weak var textField: UITextField!

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "TheSegue" {
        let vc = segue.destinationViewController as! ViewController2
        vc.toPass = self.textField.text!
    }
  }


}

【问题讨论】:

  • 以上代码中没有ViewController2。这是导致该错误的实际代码吗?如果没有,您能否发布产生错误UIViewController is not convertible to ViewController2 的代码。
  • 这不是问题。我选择 ViewController2 来提问,现在我也在上面的代码中更改了它。真正的问题是什么:)?
  • 你的 ViewController2 是扩展 UIViewController 类吗?
  • 是的,当我创建 Cocoa 文件时,我选择了 UIViewController 类
  • 请在您的问题中显示来自ViewController1.swiftViewController2.swift 的代码。

标签: ios swift segue


【解决方案1】:

以下示例对我来说很好。第一个视图控制器的代码:

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "TheSegue" {
            let vc = segue.destinationViewController as! ViewController2
            vc.passedText = self.textField.text!
        }
    }
}

在第二个视图控制器中:

    class ViewController2: UIViewController {
        var passedText: String = ""
        @IBOutlet weak var label: UILabel!

        override func viewDidLoad() {
            super.viewDidLoad()
            self.label.text = "passed: \(self.passedText)"
        }
    }

不要忘记在情节提要中命名 segue:

您的目标视图控制器引用了错误的控制器。你的代码中应该有这个,而不是as! ViewController1:

let vc = segue.destinationViewController as! ViewController2

还需要修复您的IBOutlet 名称,vc.toPass = self.textField.text! 应该是:

vc.toPass = self.labeld.text!

确保为第二个视图控制器设置了自定义类:

【讨论】:

  • @ArdaBoğa 请将其余代码添加到您的问题中。它将帮助人们回答您的问题。否则,可能会导致我们不知道的问题。
  • 我刚刚将它添加到问题中
  • @ArdaBoğa 好的,我更新了我的答案。看起来您的目标视图控制器是错误的。
  • 这不是问题;当我发布问题时,我更改了控制器的名称,并且在我在这里写问题时犯了一个错误。所以,它指的是控制器2。仍然卡住:S
  • @ArdaBoğa 视图控制器之间的 segue 是如何连接的?
【解决方案2】:

可能只是 ViewController2 没有声明为 UIViewController 的子类。
在 ViewController2 文件的顶部,您可以将其声明如下:

    class ViewController2: UIViewController {

    \\ ...

}

【讨论】:

  • 它被声明为 UIViewController 的子类
【解决方案3】:

您是否在情节提要中设置了名称?在自定义类下,Class需要指向视图控制器关联的类。

这个类不符合键的键值编码 labelPassedData。但我什至没有像这样的变量 labelPassedData

点击查看控制器并按下右箭头按钮,它会显示所有连接。

我猜你复制并粘贴了视图控制器,因此你遇到了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2013-01-31
    • 2013-01-17
    • 2020-09-04
    • 2017-04-14
    • 2015-11-09
    相关资源
    最近更新 更多