我正在考虑编写一些辅助函数,以便更轻松地对我的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文件中的麻烦。
答案 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你想要访问它而不需要接线。
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文本字段(第三列实用程序)
如果您有大量的网点,并且想要将它们全部链接起来,则可以使用此方法。