仅使用标记更改标签

时间:2013-11-11 03:59:07

标签: uilabel xib

我正在创建一个包含多个按钮和相应标签的应用程序。 布局是一个nib(.xib)文件,它连接到我有下面代码的类。我试图避免为每个标签使用IBOutlet,因为这会产生许多额外的代码。

我知道有一种方法可以使用标签来引用标签:

UILabel *countLabel = (UILabel *)[self.view viewWithTag:numOfTag];

我在buttonPressed方法中调用了它。但是,当我尝试更改文本时

[countLabel setText:@"newLabel"];
该应用程序崩溃了。我错了吗?我是XCode的新手......帮助!

谢谢:)

2 个答案:

答案 0 :(得分:0)

您的标签不得与viewWithTag:一起找到,因此它将为零。当你试图访问nil控件的属性时,它可能会让你崩溃。

检查您的标签是否为零并检查是否为标签

if(countLabel != nil && [countLabel isKindOfClass:[UILabel class]])
    [countLabel setText:@"newLabel"];
else
    NSLog(@"countLabel is not found");

viewWithTag:将搜索接收者层次结构中的视图,其tag属性与tag参数中的值匹配。这将返回它将与层次结构中的标记相遇的第一个控件。因此,请确保您的标记在整个视图中都必须如此独特。只需确保您提供的是Label的直接父级而不是self.view

修改

如果您无法跟踪问题,也可以尝试这种方式。

for (UIView *child in self.view.subviews) {
    if([child isKindOfClass:[UILabel class]] && [child tag] == numOfTag)
    {
        [child setText:@"newLabel"];
        break;
    }
}

答案 1 :(得分:0)

这不是正确的做法。首先,只要在XIB文件中创建UILabel,就可以在技术上对它们进行命名,而无需在连接的视图控制器中设置标签值。其次,即使您想在稍后阶段重置标签,使用IBOutlets连接它们也是最好的选择。扫描所有子视图,然后使用其标记查找特定子视图更加繁琐,在这种情况下应该避免。

编辑:

对于需要创建50个以上按钮和标签的情况,我建议您使用UIButton和UILabel创建自定义UIView。然后在要显示它们的视图中,在for循环中创建对象并显示它们。当点击UIButton时,您可以通过自定义UIView对象轻松获取关联的UILabel。