无法转换类型的值

Rya*_*gue 4 cocoa-touch ios swift

我正在创建一个Tic Tac Toe应用程序.当游戏重置时,所有X和Os UIButton图像都应该返回nil.电路板中的每个空间都标记为0到8.

  var buttonsToClear : UIButton

    for var i = 0; i < 9; i++ {

        buttonsToClear = view.viewWithTag(i) as! UIButton

        buttonsToClear.setImage(nil, forState: .Normal)

    }
Run Code Online (Sandbox Code Playgroud)

在我添加导航栏之前,一切正常.现在我收到错误消息

"无法将'_UINavigationBarBackground'(0x107e2f2a0)>类型的值转换为'UIButton'(0x107e357e0).(lldb)

我绝对肯定我的新导航栏标签为"10".

导航栏标记

还有什么可以触发这条消息?

Hit*_*nki 5

你在逻辑上是正确的,你的代码将完美地运作.

你收到了错误

"无法投型的值 '_UINavigationBarBackground'(0x107e2f2a0)>为 '的UIButton'(0x107e357e0).(LLDB)

因为,当你for loop运行时,第一个索引将为零,即i = 0,

buttonsToClear = view.viewWithTag(i) as! UIButton
Run Code Online (Sandbox Code Playgroud)

会变成

buttonsToClear = view.viewWithTag(0) as! UIButton
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您尝试使用tag值0 获取视图.

UINavigationBarBackground 标签值也为0.

注意:

1.当系统找到两个具有相同标记值的视图时,如果您尝试使用viewWithTag:它查看视图将返回第一个视图.

2.每个视图的默认标记值为0.

3.只需在故事板或XIB中拖动UILabel或UIView并检查其标记值.

所以在你的情况下,它将返回UINavigationBarBackground而不是UIButton.所以你不能类型转换UINavigationBarBackgroundUIButton.

解决您的错误:

永远不要给从0开始的标签.尝试给出一些像1000这样的值的标签.所以你的第一个按钮将有1000个标签,接下来将有1001,然后是1002等等.

写下你的for循环如下.

var buttonsToClear : UIButton

    for var i = 1000; i < 1009; i++ {

        buttonsToClear = view.viewWithTag(i) as! UIButton

        buttonsToClear.setImage(nil, forState: .Normal)

    }
Run Code Online (Sandbox Code Playgroud)