我正在使用2个ViewController构建iOS应用,第一个是 StartViewController.swift ,第二个是 ViewController.swift 。
StartViewController显示了9个UIButton,我在Xcode的属性检查器中为每个UIButton分配了一个单独的标签,即0到8之间的整数。
每个按钮代表用户想要了解更多信息的某个主题。相应地,我的项目中还有一个文件,在该文件中,我创建了一个标题和相应文本的数组,这些标题和相应文本表示要向用户显示的相关信息。第二个VC(ViewController.swift)具有2个UILabel,分别显示标题和文本。
简而言之,我想获取按钮的标记(一个Int),并使用ist在数组中使用相应索引输出主题信息。
我已经将两个VC与一个名为 startToTopicSegue 的UIStoryboardSegue连接起来。 然后,我实现了prepare(for segue:)方法并设置了按钮。通过打印声明,我已经确认 1)StartViewController.swift中的sender.tag确实是点击按钮的标签,并且 2)tagPassedOver变量应按需要在ViewController.swift中设置标题和文本标签。
但是tagPassedOver根本不受我在viewDidLoad()中指定的内容的影响,而是将其初始值保持为0-我该如何更改呢?
我强烈感觉到它与第一个VC中的发件人的规范有关,但是现在我有点迷失在翻译中,因此不胜感激;)-谢谢!< / p>
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
答案 0 :(得分: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
}
}
}
答案 1 :(得分:0)
您可以在sender参数中发送标签Int值
performSegue(withIdentifier: "startToTopicSegue", sender: sender.tag)
在准备方法中将发送方转换为Int值
destinationVC.tagPassedOver = sender as! Int
答案 2 :(得分: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的标识符,然后强制解开其目标,来利用可选的核心功能。