在Swift中使用标签

5

我在控制器中有大约15个UIButtons。我试图用一个简单的for循环清除其中的10个,但似乎出现了某种冲突。

当我点击清除按钮时,我会收到以下错误:

无法将类型为“_UISizeTrackingView”(0x18a023c)的值转换为“UIButton”(0x1899298)。 (lldb)

for循环是:

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

我已经缩小了问题范围,发现一个项目正在使用标签0。我查看了视图控制器场景上的所有项目,但似乎没有冲突。我只看到一个按钮使用了tag=0。

我甚至通过将循环中的“i”替换为“0”,并得到了相同的问题来确认它。当我用“1”或“2”替换它时,单个图像可以正常工作。

有什么方法可以查看哪个对象正在使用标签0吗?我已经点击了它们所有(包括主“View”),但似乎找不到任何东西。

2个回答

9

正如@ranunez所说,缺省标签为0。我不同意使用非零标签的建议。

我的建议是,根本不使用标签。如果您想在代码中使用视图,请声明一个输出口并将其连接起来。如果要遍历多个视图,请从输出口创建一个数组或使用多个输出口的集合:

@IBOutlet var buttons: [UIButton]!

作为额外的奖励,现在我们可以通过 for in 遍历它们。我不知道 Swift,但在 Objective-C 中,for in 肯定比问题中原始的 C 风格的 for 更快。 - nhgrif
@Sulthan 为什么人们更喜欢使用outlets而不是tags?我的意思是这会减少代码长度,对吧!我说得好听吗?还是使用tags会增加复杂性? - Anurag Sharma
@AnuragSharma 代码长度从未是任何事情的相关度量标准。重要的是代码易读性和可维护性。每次使用标签时,都必须创建一个常量。每次想要使用已标记的视图时,都必须搜索视图层次结构进行查找。什么更容易阅读?将视图连接到命名变量还是创建标识符?直接使用视图还是在使用前进行搜索? - Sulthan
@Sulthan非常有帮助,但是如果我只在viewWillLayoutSubview()或viewDidLoad()中声明UIView呢? - Anurag Sharma
@AnuragSharma 你仍然可以将其放入属性中,没有任何改变。 - Sulthan
@Sulthan 好的,如果没有任何变化,那么我肯定选择使用属性而不是标签。非常感谢! - Anurag Sharma

0

默认情况下,视图的标签为0,因此您不应该依赖此来删除具有标签0的对象。尝试给您的按钮一个不同的标签集,例如:1000、1001、1002等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接