【问题标题】:could not cast value of type UIView to UIButton无法将 UIView 类型的值转换为 UIButton
【发布时间】:2015-11-18 05:21:00
【问题描述】:

我已经在 swift 中制作了井字游戏 .. 游戏完成了我卡在最后一点,即当用户再次按下播放按钮时,我想将所有按钮图像设置回 nil,以便用户可以重新开始玩游戏了。我使用标签属性将其设置回零。我编码了这个:

for i = 0 ; i < 8 ; i++ {
  var button = view.viewWithTag[i] as! UIButton
  button.setImage(nil, forState:.normal)
}

但它给出了错误

无法将 UIView 类型的值转换为 UIButton

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    需要检查标签是否配置正确

       for var i = 0 ; i < 8 ; i++ {
            let subview = view.viewWithTag(i)
            if subview?.isKindOfClass(UIButton) == true{
                let button = subview as! UIButton
                button.setImage(nil, forState:UIControlState.Normal)
            }else{
                print("Tag \(i) is not configured right")
            }
        }
    

    另外,就像@Dharmbir Choudhary所说的

    如果你使用标签来获取按钮,不要以0开头,因为默认标签是0很容易搞砸。

    【讨论】:

    • 你复制了我的最后一行 :)
    • 对不起,没看到你的话,我会更新以注意你先说的
    【解决方案2】:

    viewWithTag 中使用这个括号() 代替[]

        for i = 0 ; i < 8 ; i++ {
    
            var button = view.viewWithTag(i) as! UIButton
            button.setImage(nil, forState:.normal)
    
        }
    

    您必须记住 xib 中的每个子视图都有标记 0(默认),因此您需要将其从 1 分配给您的按钮并通过 i = 1 开始 for 循环。

    【讨论】:

      【解决方案3】:

      你的代码没问题。问题可能在于 swift 在找到第一个按钮之前找到了其他带有零标签的东西,它不能转换为按钮。我建议您转到情节提要并在视图中将您的零标签按钮移到所有其他按钮之上。这将允许 swift 首先找到您的零标签按钮。我希望这会有所帮助! :)

      【讨论】:

      • 这对我有帮助,我觉得使用标签真的很棘手,因为很多视图可能不小心有相同的标签。
      【解决方案4】:

      应该是 viewWithTag(i) 而不是 viewWithTag[i]

      【讨论】:

        【解决方案5】:

        这样做;

        for i = 0 ; i < 8 ; i++ {
          if let button:UIButton = view.viewWithTag(i) as? UIButton {
             button.setImage(nil, forState:.normal)
          }
        }
        

        注意:确保没有任何其他视图具有标记 0 到 8。

        【讨论】:

          【解决方案6】:

          出现这种混乱是因为在您的屏幕中还有其他控件也具有 tag = 0,因为您在屏幕上放置的任何控件默认标记为 0。

          所以,这个问题有两种解决方案:

          1. 将其他控件标记更改为非零意味着将任何大于 0 但不在 0 的标记值设置为 8。
          2. 或将按钮标签更改为 10 到 17 而不是 0 到 7

          将以下代码用于选项 1:

          for var i:Int = 0 ; i < 8 ; i++ {
              let button = view.viewWithTag(i) as! UIButton
              button.setImage(UIImage(), forState: UIControlState.Normal)
          }
          

          并将以下代码用于选项 2:

          for var i:Int = 10 ; i < 11 ; i++ {
              let button = view.viewWithTag(i) as! UIButton
              button.setImage(UIImage(), forState: UIControlState.Normal)
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-27
            • 2018-05-03
            • 1970-01-01
            相关资源
            最近更新 更多