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

时间:2018-09-16 08:53:18

标签: ios swift uibutton uistoryboardsegue

我正在使用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

3 个答案:

答案 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的标识符,然后强制解开其目标,来利用可选的核心功能。