2014-08-31 32 views
1

我實例從XIB多個克隆的觀點,這樣的:訪問從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我的元素。我想知道是否有一種方法可以在沒有迭代的情況下直接引用?

回答

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

由outlet引用有什麼問題?我認爲它會工作得很好。
它只關乎你如何做點引用。

例子:

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:方法訪問它們。

例子:

說在你們這 'MyNib' 一個UILabel有標籤100,那麼你可以通過引用它:

[view viewWithTag:100]; 

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