我正在创建一个包含多个按钮和相应标签的应用程序。 布局是一个nib(.xib)文件,它连接到我有下面代码的类。我试图避免为每个标签使用IBOutlet,因为这会产生许多额外的代码。
我知道有一种方法可以使用标签来引用标签:
UILabel *countLabel = (UILabel *)[self.view viewWithTag:numOfTag];
我在buttonPressed方法中调用了它。但是,当我尝试更改文本时
[countLabel setText:@"newLabel"];
该应用程序崩溃了。我错了吗?我是XCode的新手......帮助!
谢谢:)
答案 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。