2014-08-31 2 views
1

나는이처럼 XIB에서 여러 복제 뷰를 인스턴스화하고 있습니다 :XIB에서 인스턴스화 된 뷰의 하위 뷰에 액세스하는 가장 좋은 방법은 무엇입니까?

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

그때 나는 서브 뷰에 액세스해야하는 뷰의 모든 하나의 (예를 들어, 레이블을 변경). 요소를 IBOutlet과 연결하면 여기에서 작동하지 않습니다 (참조가 다시 작성되지만 가장 최근의 뷰가 인스턴스화되므로). 파단 restorationIdentifier으로 내 요소를 찾을 수 있지만

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

그래서 나는 기본적으로 반복 해요 :

여기에 지금까지의 내 최선입니다. 반복없이 직접 참조 할 수있는 방법이 있는지 궁금합니다.

답변

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

콘센트로 인한 문제점은 무엇입니까? 나는 그것이 정상적으로 작동 할 것이라고 생각한다.
도트 참조를하는 방법에 관한 문제입니다.

예 :

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"];