如何使用prepareForSegue将UIButton的标签(Int)传递给其他ViewController(Swift 4,Xcode 9)

Car*_*Cat 2 uibutton ios uistoryboardsegue swift

我正在构建一个带有 2 个 ViewController 的 iOS 应用程序,第一个是StartViewController.swift,第二个是ViewController.swift

\n\n

StartViewController 显示了 9 个 UIButton,我在 Xcode 的属性检查器中为每个按钮分配了一个单独的标签,即从 0 到 8 的整数。

\n\n

每个按钮都代表用户想要了解更多信息的某个主题。因此,我的项目中有另一个文件,我在其中创建了一系列标题和相应的文本,这些文本代表我想要向用户显示的相关信息。第二个 VC (ViewController.swift) 有 2 个 UILabel,分别显示标题和文本。

\n\n

简而言之,我想获取 Button\xe2\x80\x99s 标签(一个 Int)并使用 ist 输出具有数组中相应索引的主题信息。

\n\n

我已将两个 VC 与我命名为startToTopicSegue 的UIStoryboardSegue 连接起来。\n然后我实现了prepare(for segue:) 方法并设置了按钮。通过 print 语句,我已经确认\n1) StartViewController.swift 中的 sender.tag 确实是点击的按钮的标签,\n2) tagPassedOver 变量按其应有的方式设置了 ViewController.swift 中的标题和文本标签。

\n\n

但 tagPassedOver 根本不受我在 viewDidLoad() 中指定的内容的影响,而是保留初始值 0 - 我该如何更改它?

\n\n

我有一种强烈的感觉,它与第一个 VC 中发送者的规范有关,但现在我在翻译中迷失了方向,所以任何帮助将不胜感激;) - 谢谢!

\n\n

StartViewController.swift

\n\n
@IBAction func buttonPressed(_ sender: UIButton) {\n    print(sender.tag)\n\n    performSegue(withIdentifier: "startToTopicSegue", sender: UIButton.self)\n}\n\nfunc prepare(for segue: UIStoryboardSegue, sender: AnyObject) {\n    if segue.identifier == "startToTopicSegue"{\n        let destinationVC = segue.destination as! ViewController\n        destinationVC.tagPassedOver = sender.tag\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

ViewController.swift

\n\n
var tagPassedOver : Int = 0\n\n@IBOutlet weak var headingLabel: UILabel!\n@IBOutlet weak var textLabel: UILabel!\n\noverride func viewDidLoad() {\n\n    headingLabel.text = allTopics.list[tagPassedOver].topicHeading\n    textLabel.text = allTopics.list[tagPassedOver].topicText\n
Run Code Online (Sandbox Code Playgroud)\n

Rak*_*tri 5

您应该传递您需要的标签的实例。UIButton

@IBAction func buttonPressed(_ sender: UIButton) { 
    print(sender.tag)
    performSegue(withIdentifier: "startToTopicSegue", sender: sender) // You have required button in sender, so pass that as sender
}
Run Code Online (Sandbox Code Playgroud)

并在prepare方法中将发送者转换为UIButton并检索它。

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "startToTopicSegue"{
        let destinationVC = segue.destination as! ViewController
        if let button = sender as? UIButton {
            destinationVC.tagPassedOver = button.tag
        }
    }
}
Run Code Online (Sandbox Code Playgroud)