2012-10-16 2 views
3

XIB 파일에서 구성 요소를 외부화하여 여러 다른 뷰에서 재사용 할 수 있도록했습니다. 이제 내보기 컨트롤러에서 내가 XIB 기반의 UIView을로드를 통해 현재보기에 추가 : 처음에NIB로드 된 뷰를 사용하는 UIView.addSubview는 루트 UIView 만 추가합니다.

NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil]; 
_likePreview = [views objectAtIndex:0]; 
[self.view addSubview:_likePreview]; 

, 나는 그것이 작동하지 않는 것으로 생각하지만 실제로는하지만, 단지를 넣어 작품 루트보기 (내 모든 그래픽 구성 요소의 컨테이너 즉, 투명) 내보기.

그래서 내가 (모든 하위 구성 요소에 대한) 이러한 종류의 코드를 넣어야 작동하도록 :

[self.view addSubview:_likePreview]; 
NSArray *subviews = _likePreview.subviews; 
for(UIView * subview in subviews) { 
    [self.view addSubview:subview]; 
} 

이것은 매우 직관적이며, 또한 나는 뷰 계층을 생성하지 않습니다 생각 나는 원한다.

XIB에서 사용자 지정 테이블 헤더를로드하기 위해 UITableViewController에서 같은 종류의 작업을했기 때문에 솔루션이 있다고 확신합니다. 이 상황에서 정확히 동일한 XIB 파일을 사용하면 모든 것이 올바르게로드됩니다. 여기에 코드입니다 :

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    switch(section) { 
     case 0: { 
      NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil]; 
      _likePreview = [views objectAtIndex:0]; 
      return _likePreview; 
     } 
    } 
    return [super tableView:tableView viewForHeaderInSection:section]; 
} 

위의 코드로, 모든 것을 내 테이블 섹션의 헤더로 전체보기 (모든 내용 = 루트 뷰 컨테이너)를 가지고, 괜찮습니다.

그래서 질문입니다. 첫 번째 예에서 내가 뭘 잘못하고 있습니까? 상위 UIView에 모든 콘텐츠 (컨테이너 + 모든 콘텐츠)를 적절한 UIView 계층 구조로 추가하려면 어떻게합니까?

편집 : 나는 다음과 같이 모든 것이 (나는 이미지를 게시 할 수 없습니다), 단일 루트의 UIView 내 XIB 파일로 구성되어 정확해야합니다

* Thumbs preview view 
|_ Button 
|_ Image View 
|_ Image View 
|_ Image View 
|_ Image View 
|_ Button 
|_ Button 
|_ Button 
|_ Label 

는 당신의 도움을 주셔서 감사합니다! 구성 요소를로드

크리스토프

답변

3

한 가지 방법은 상단 UIView 객체 (들. 첨부 된 스크린 샷)으로 구성 요소를 저장하는 것입니다.

http://a1.img.mobypicture.com/fd182b5ba5c55fa1fba9162f395ddb98_full.jpg

그런 다음 평소와 같이 귀하의 펜촉을로드 뷰 계층에 구성 요소를 추가 -addSubview:를 사용할 수 있습니다.

EDIT :

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

와 펜촉 적재

[self.view addSubview:view]; 

다음보기 관계의 계층에 리드 뷰 계층 뷰 추가 :

(lldb) po [[self view] recursiveDescription] 
(id) $1 = 0x088487b0 <UIView: 0x89595b0; frame = (0 0; 320 548); autoresize = W+H; layer = <CALayer: 0x8958b30>> 
    | <UIView: 0x89755c0; frame = (0 0; 320 200); autoresize = RM+BM; layer = <CALayer: 0x8975080>> 
    | | <UIView: 0x8975620; frame = (200 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8975680>> 
    | | <UIView: 0x8975700; frame = (20 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8974ea0>> 
    | | <UIRoundedRectButton: 0x8975790; frame = (20 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8975890>> 
    | | | <UIGroupTableViewCellBackground: 0x8976030; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8976100>> 
    | | | <UIImageView: 0x89768d0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x89770f0>> 
    | | | <UIButtonLabel: 0x8977af0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8977be0>> 
    | | <UIRoundedRectButton: 0x8978990; frame = (227 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8978a60>> 
    | | | <UIGroupTableViewCellBackground: 0x8978a90; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8978b10>> 
    | | | <UIImageView: 0x8978b80; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8979230>> 
    | | | <UIButtonLabel: 0x8978be0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8978cd0>> 
+0

이것은 정확히 내가 가지고있는 것입니다 : –

+0

수정 된 질문을 확인하십시오. XIB를로드하고 [self.view addSubView : loadedNib]를 통해 추가하면 루트보기 만로드되며 자식은로드되지 않습니다. –

+0

NIB로드는 OK입니다. 뷰에 추가 할 때 문제가 발생합니다. [self.view addSubview : _likePreview]; 루트보기 만 추가합니다.모든 하위보기를 하나씩 추가해야합니다. NSArray * subviews = _likePreview.subviews; (하위보기의 UIView * 하위보기) { [self.view addSubview : subview]; } –

관련 문제