【问题标题】:How to create sender.tag UIButton in another function?如何在另一个函数中创建 sender.tag UIButton?
【发布时间】:2019-05-03 23:05:03
【问题描述】:

我有一组答案和一组按钮。当我在 sender.tag 的帮助下单击特定按钮时,我会更改索引。我还需要在override func prepare(for segue: UIStoryboardSegue, sender: Any?) 中进行操作,以便通过索引设置答案,结果将转到另一个屏幕。

当我尝试创建 sender.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

}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    在这种情况下,准备转场功能的sender 不一定是UIButton,它是启动转场的任何东西。您可以通过尝试将其转换为一个来检查它是否是一个按钮,如下所示:

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

    您还可以在answerPressed 函数中做,而不是执行一个segue,您可以在那里自己实例化ResultViewController,然后推送到它。因为当你在这个函数中时,你知道发件人是UIButton,它应该有一个标签。

    【讨论】:

      【解决方案2】:

      由于任何事物都可以是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
      }
      

      【讨论】:

        【解决方案3】:

        “任何?”类型的值没有成员“标签”

        意味着Any 对象确实没有tag 属性。你知道你的sender 是一个UIButton,那么为什么不CASTprepareForSeguesender 转换为UIButton 对象,像这样呢?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多