如何使用 prepareForSegue (Swift 4, Xcode 9) 将 UIButton 的标签(一个 Int)传递给其他 ViewController
How to pass UIButton's tag (an Int) to other ViewController using prepareForSegue (Swift 4, Xcode 9)
我正在构建一个带有 2 个 ViewController 的 iOS 应用程序,第一个是 StartViewController.swift,第二个是 ViewController.swift.
StartViewController 显示了 9 个 UIButton,我在 Xcode 的属性检查器中为每个分配了一个单独的标签,即从 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,但现在我有点迷失在这里的翻译,所以任何帮助将不胜感激; ) - 谢谢!
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
您应该传递您需要其标签的 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
}
}
}
您可以在 sender 参数中发送标签 Int 值
performSegue(withIdentifier: "startToTopicSegue", sender: sender.tag)
并在 prepare 方法中将 sender 转换为 Int 值
destinationVC.tagPassedOver = sender as! Int
作为 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 的标识符然后强制解包其目标。
我正在构建一个带有 2 个 ViewController 的 iOS 应用程序,第一个是 StartViewController.swift,第二个是 ViewController.swift.
StartViewController 显示了 9 个 UIButton,我在 Xcode 的属性检查器中为每个分配了一个单独的标签,即从 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,但现在我有点迷失在这里的翻译,所以任何帮助将不胜感激; ) - 谢谢!
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
您应该传递您需要其标签的 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
}
}
}
您可以在 sender 参数中发送标签 Int 值
performSegue(withIdentifier: "startToTopicSegue", sender: sender.tag)
并在 prepare 方法中将 sender 转换为 Int 值
destinationVC.tagPassedOver = sender as! Int
作为 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 的标识符然后强制解包其目标。