如何使用prepareForSegue(Swift 4,Xcode 9)将UIButton标记(Int)传递给另一个ViewController

问题描述 投票:0回答:3

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

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

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

简而言之,我想获取按钮的标签(Int)并使用ist输出主题信息和我的数组中的相应索引。

我已将两个VC连接到一个名为startToTopicSegue的UIStoryboardSegue。然后我实现了prepare(for segue :)方法并设置了按钮。使用print语句,我已经确认1)StartViewController.swift中的sender.tag确实是tapped按钮的标记,2)tagPassedOver变量设置了ViewController.swift中的标题和文本标签。

但是tagPassedOver根本不受我在viewDidLoad()中指定的内容的影响,而是保持init值为0 - 如何更改?

我有强烈的感觉,它与第一个VC中的发件人的规范有关,但是现在我在这里有点丢失,所以任何帮助都会受到赞赏;) - 谢谢!

StartViewController.swift

@IBAction func buttonPressed(_ sender: UIButton) {
    print(sender.tag)

    performSegue(withIdentifier: "startToTopicSegue", sender: UIButton.self)
}

func prepare(for segue: UIStoryboardSegue, sender: AnyObject) {
    if segue.identifier == "startToTopicSegue"{
        let destinationVC = segue.destination as! ViewController
        destinationVC.tagPassedOver = sender.tag
    }
}

ViewController.swift

var tagPassedOver : Int = 0

@IBOutlet weak var headingLabel: UILabel!
@IBOutlet weak var textLabel: UILabel!

override func viewDidLoad() {

    headingLabel.text = allTopics.list[tagPassedOver].topicHeading
    textLabel.text = allTopics.list[tagPassedOver].topicText
ios swift uibutton uistoryboardsegue
3个回答
2
投票

你应该传递你需要的标签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
}

并且在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
        }
    }
}

0
投票

您可以在sender参数中发送标记Int值

performSegue(withIdentifier: "startToTopicSegue", sender: sender.tag)

并在prepare方法中将发送者转换为Int值

destinationVC.tagPassedOver = sender as! Int

0
投票

作为Rakesha Shastri回答的后续内容,我建议在实现prepare(for:sender:) segue方法时使用以下代码格式

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if 
       let destination = segue.destination as? ViewController,
       let button = sender as? UIButton {
            destinationVC.tagPassedOver = button.tag
        }
    }
}

这通过安全地展开segue目的地来使用选项核心功能,而不是检查segue的标识符然后强制展开其目的地。

© www.soinside.com 2019 - 2024. All rights reserved.