访问从XIB实例化的视图子视图的最佳方法?

时间:2014-08-31 15:10:30

标签: ios ios7 uiview xib ios8

我从XIB实例化多个克隆视图,如下所示:

UIView *view = [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil][0];

然后我需要访问每个视图的子视图(例如,更改标签)。 使用IBOutlet连接元素在这里不起作用(因为引用将被重写但最近的视图被实例化)。

到目前为止,这是我最好的一次拍摄:

for (UIView *subview in myView.subviews) {
    if ([subview.restorationIdentifier isEqualToString:@"myTargetElement"]) {
        // do something with the view
        break;
    }
}

所以我基本上通过子视图迭代来通过restorationIdentifier找到我的元素。我想知道是否有办法在没有迭代的情况下获得直接引用?

2 个答案:

答案 0 :(得分:3)

您可以使用IBOutlets。需要将它们设置为自定义视图子类,而不是添加视图的视图控制器。这样的事情很好,

#import "ViewController.h"
#import "RDView.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    RDView *view = [[NSBundle mainBundle] loadNibNamed:@"RDView" owner:self options:nil][0];
    [self.view addSubview:view];
    view.topLabel.text = @"Hello";
    view.bottomLabel.text = @"Goodbye";
}

答案 1 :(得分:1)

出口参考有什么问题?我认为它的效果会很好 重要的是你如何进行点引用。

示例:

UIView *view = [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil][0];
//...
UIView *view_1 = [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil][0];
//...
[view.someLabel setText:@"1"];
[view_1.someLabel setText:@"2"];

无论如何......或者,您可以为subview提供特定标记,并通过-viewWithTag:方法访问它们。

示例:

假设您的UILabel'中的MyNib标记为100,那么您可以通过以下方式引用它:

[view viewWithTag:100];

//like so:
//UILabel *lblTemp = [view viewWithTag:100];
//[lblTemp setText:@"NewText"];