如何在不“连接”它们的情况下以编程方式访问NIB中的UI元素?

时间:2010-02-18 21:31:58

标签: iphone interface-builder nib

我正在考虑编写一些辅助函数,以便更轻松地对我的iPhone NIB中的UI元素进行简单的更改。主要是 - 我想通过Interface Builder中的Name访问UILabel或其他元素。这可能吗?有更聪明的方法吗?

实施例

说我想制作一个显示'Hello World'的超级简单的iPhone应用程序。我启动一个新项目,然后打开NIB并将UILabel拖到我的视图中,并为其命名为'LblMain'。现在,假设我已经包含了我方便的帮助函数,我想给标签分配一些类似的新文本:

[helper setText:@"Hello World" forLabel:@"LblMain"];

- 或 -

UILabel *ObjTmp = [helper getUILabel:@"LblMain"];
ObjTemp.text = @"Hello World";

现在 - 诀窍是我没有添加:

IBoutlet UILabel *ObjLblMain;

.h文件中的任何地方 - 我只是动态访问该标签 - 这不是很好吗?!

现在,对于简单的应用程序,要添加更多标签或图像,我可以将它们拖到我的NIB中,在该元素的检查器窗口中为它们分配名称,然后立即在代码内访问它们而不会出现口吃和放大。将它们添加到.h文件中的麻烦。

动机

  • 基本上,我很沮丧,我必须连接我的NIB中的每一个元素 - 这是很多口吃和簿记,我宁愿避免。
  • 我可以为设计提供一些命名约定,他们可以生成NIB而无需与实现密切相关。

5 个答案:

答案 0 :(得分:8)

加载对象后,名称100%无法访问,我一直认为这也很奇怪。

可访问的是“tag”,如果你真的想要在不定义插座的情况下访问元素,你可以设置(仅限整数)“tag”值,然后在包含标记元素的superview中调用{{1传入相同的整数。不要忘记默认值为“0”,所以请使用别的东西。

答案 1 :(得分:4)

您绝对可以通过编程方式加载NIB,查找所有对象并查询它们以找出指向的内容。只需看看Loading Nib Files Programmatically。但问题是Interface Builder身份名称不会暴露在IB之外。所以我不确定你会用什么作为“forLabel”参数。 “名称”字段只是IB文档窗口的便利。它不是NSObject上的属性。

答案 2 :(得分:1)

可以通过元素标签来完成:
假设您有UIView xib文件名为" yourView"在它内部有UILabel你想要访问它而不需要接线。

  1. 在" yourView"中设置标签到UILabel。 xib文件,假设您将UILabel标记设置为100。
  2. 加载" yourView"使用此代码,无需任何接线即可获得UILabel的任何地方 UILabel* yourlabel =(UILabel*) [yourView viewWithTag: 100]; //do whatever you want to your label.

答案 3 :(得分:0)

我认为您可以尝试在某些外部编辑器中打开xib作为XML并查看编译器如何看待它,然后您可能会以相同的方式执行

答案 4 :(得分:0)

对于iOS6 +,您可以使用restorationId而不是tag,以使其更具可读性,例如,您可以在nib文件和恢复ID中设置相同的名称。

如果您不想将笔尖中的所有插座链接到视图控制器,您仍然可以通过搜索当前视图子视图树来访问它们。请注意,子视图排列是一棵树(您可以在nib文件中看到相同的树),因此如果您有嵌套视图,则需要进行一些递归。

例如:

UIButton *nibButtonView = nil;
for (UIView *view in [self.view subviews]){
    if ([view.restorationIdentifier isEqualToString:@"myNibButtonView"]){
        nibButtonView = (UIButton *)view;
    }
}
[nibButtonView setTitle:@"Yeah" forState:UIControlStateNormal];

在您的nib文件中,您应该有一个按钮,其restoreId等于" myNibButtonView",您可以在身份检查器中找到restoreId文本字段(第三列实用程序)

如果您有大量的网点,并且想要将它们全部链接起来,则可以使用此方法。