0

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

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

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

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

[countLabel setText:@"newLabel"];

应用程序崩溃。我访问错了吗?我是 XCode 的新手..帮助!

谢谢 :)

4

2 回答 2

0

这不是正确的做法。首先,每当您在您的 XIB 文件中创建 UILabel 时,您只能在技术上命名它们,您无需在连接的视图控制器中设置标签值。其次,即使您想在后期重置标签,使用 IBOutlets 连接它们也是最好的选择。扫描所有子视图,然后找到带有标签的特定子视图更加繁琐,在这种情况下应该避免。

编辑:

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

于 2013-11-11T04:12:38.470 回答
0

你的标签不能用 找到viewWithTag:,所以它是 nil。当你尝试访问 nil 控件的属性时,它可能会让你崩溃。

检查您的标签是否不为零并检查它是否是标签使用

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

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

编辑:

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

for (UIView *child in self.view.subviews) {
    if([child isKindOfClass:[UILabel class]] && [child tag] == numOfTag)
    {
        [child setText:@"newLabel"];
        break;
    }
}
于 2013-11-11T04:06:23.967 回答