Iphone 如何在没有';的情况下以编程方式访问NIB中的UI元素;布线';他们?

Iphone 如何在没有';的情况下以编程方式访问NIB中的UI元素;布线';他们?,iphone,interface-builder,nib,Iphone,Interface Builder,Nib,我正在考虑编写一些助手函数,以便更轻松地对iPhone NIB中的UI元素进行简单更改。主要-我想通过Interface Builder中的名称访问UILabel或其他元素。这可能吗?有更聪明的方法吗 例子 假设我想制作一个超级简单的iPhone应用程序,显示“Hello World”。我启动一个新项目,然后打开NIB,将UILabel拖到我的视图中,并给它一个名为“LblMain”。现在,假设我已经包含了handy helper函数,我想为标签分配一些新文本,如下所示: [helper set

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

例子 假设我想制作一个超级简单的iPhone应用程序,显示“Hello World”。我启动一个新项目,然后打开NIB,将UILabel拖到我的视图中,并给它一个名为“LblMain”。现在,假设我已经包含了handy helper函数,我想为标签分配一些新文本,如下所示:

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

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

IBoutlet UILabel *ObjLblMain;
在.h文件中的任何地方-我只是动态访问该标签-这不是很好吗

现在,对于简单的应用程序,要添加更多的标签或图像,我可以将它们拖到我的NIB中,在该元素的inspector窗口中为它们指定名称,然后立即在代码中访问它们,而无需在.h文件中添加它们

动机
  • 基本上,我很沮丧,因为我必须把笔尖上的每一个元素都连接起来——我宁愿避免很多口吃和簿记
  • 我可以给一个设计一些命名约定,它们可以生成一个NIB,而无需熟悉实现

您完全可以通过编程方式加载NIB,找到所有对象并查询它们,以确定指向什么的点。你看。但问题是Interface Builder标识名没有暴露在IB之外。因此我不确定您将使用什么作为“forLabel”参数。“Name”字段只是IB文档窗口的一种方便。它不是
NSObject

上的属性。加载对象后,名称100%不可访问,我一直认为这也很奇怪


可访问的是“标记”,如果您确实希望访问元素而不定义出口,则可以设置(仅限整数)“标记”值,然后在保存标记元素的superview中调用
viewWithTag:
传入相同的整数。不要忘了默认值是“0”,所以请使用其他内容。

我认为您可以尝试在一些外部编辑器中以XML形式打开xib,并查看编译器如何看待它,然后您可能会以相同的方式通过元素标记来完成:
假设您有一个名为“yourView”的UIView xib文件,其中有一个UILabel,您希望在不进行布线的情况下访问它

  • 在“yourView”xib文件中为UILabel设置一个标记,假设您将UILabel标记设置为100
  • 在任何地方加载“yourView”后,您都可以使用此代码获得UILabel,而无需任何连接。
    UILabel*yourlabel=(UILabel*)[yourView视图WithTag:100];
    //你想怎么做就怎么做。
    

  • 对于iOS6+,您可以使用restorationId而不是标记,以使其更“可读”,例如,您可以在nib文件和restorationId中设置相同的名称

    如果不想将nib中的所有插座链接到viewcontroller,您仍然可以通过在当前视图子视图树中搜索来访问它们。请注意,子视图排列是一棵树(与您可以在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文件中,您应该有一个restorationId等于“myNibButtonView”的按钮,您可以在identity inspector(实用程序的第三列)中找到restorationId文本字段


    如果你有大量的销售点,你可以使用它,但你不想将它们全部链接起来。

    我知道我以前看到过一些关于这方面的参考资料,但我完全无法放置/重新找到它。谢谢嗯,关于向代码发送类似“名称”的内容的无害方式,有什么建议吗?比如在“可访问性”中添加一个“提示”,然后在运行时将其清除——或者类似的事情?我可以将标签的.xib文件预处理到提示中。8个月后,我决定挖掘一下。这不是一个完整的解决方案,但一旦您指向已标记为可访问的对象,您就可以通过“[lbl accessibilityLabel];”读取其标签,这可能是某人的一个开始。
    UIButton *nibButtonView = nil;
    for (UIView *view in [self.view subviews]){
        if ([view.restorationIdentifier isEqualToString:@"myNibButtonView"]){
            nibButtonView = (UIButton *)view;
        }
    }
    [nibButtonView setTitle:@"Yeah" forState:UIControlStateNormal];