如何在另一个函数中创建Sender.tag uibutton



我有一系列答案和一系列按钮。当我单击特定按钮时,借助发件人tag,我会更改索引。我还需要在override func prepare(for segue: UIStoryboardSegue, sender: Any?)中执行此操作,以便答案是由索引设置的,结果将转到另一个屏幕。

当我尝试创建sender.tag时,我有错误

类型的价值"有?"没有会员'tag'

@IBAction func answerPressed(_ sender: UIButton) {
    let index = sender.tag
    let currentAnswer = currentQuestions?.answers[index]
    if currentAnswer!.type != .next {
        performSegue(withIdentifier: "segue", sender: sender)
    } else {
        currentQuestions = currentAnswer!.nextQuestion
        updateTittles(currentQuestions)
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let index = sender.tag
    let currentType = currentQuestions?.answers[index].type
    let resultViewController = segue.destination as! ResultViewController
    resultViewController.type = currentType
}

在这种情况下,为segue函数做准备的 sender不一定是 UIButton,而是segue发起的任何东西。您可以通过尝试将其投入到以下方式时检查是否是一个按钮:

if let button = sender as? UIButton {
    index = button.tag
}

您也可以做的是在answerPressed功能中而不是执行SEGUE,您可以自己在此处实例化ResultViewController,然后推到它。因为当您使用此功能时,您知道发件人是UIButton,并且应该具有标签。

as 任何的东西都可以是 sender的类型。参数被声明为 Any

首先检查SEGUE的identifier,在成功的力量下 sender参数到UIButton

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "segue" else { return }
    let button = sender as! UIButton
    let currentType = currentQuestions?.answers[button.tag].type
    let resultViewController = segue.destination as! ResultViewController
    resultViewController.type = currentType
}

但不必通过整个UIButton实例,标签/索引就足够了,或者 - 更有效 - 通过currentAnswer.type

@IBAction func answerPressed(_ sender: UIButton) {
    let index = sender.tag
    let currentAnswer = currentQuestions?.answers[index]
    if currentAnswer!.type != .next {
        performSegue(withIdentifier: "segue", sender: index)
    } else {
        currentQuestions = currentAnswer!.nextQuestion
        updateTittles(currentQuestions)
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard segue.identifier == "segue" else { return }
    let index = sender as! Int
    let currentType = currentQuestions?.answers[index].type
    let resultViewController = segue.destination as! ResultViewController
    resultViewController.type = currentType
}

类型的价值"有?"没有会员'tag'

表示Any对象确实没有tag属性。您知道您的senderUIButton,那么为什么不 cast prepareForSeguesender转到UIButton对象,例如So?

guard let buttonSender = sender as? UIButton else { return }

最新更新