2013-07-05 2 views
2

Nib를 사용하여 UIView를 서브 클래스하려고합니다. 다음 코드를 사용 :NIB를 사용하여 델리게이트로 UIView 서브 클래스


- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"Qus_Scale1to7View" owner:self options:nil]; 
    [self addSubview:[v objectAtIndex:0]]; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"Qus_Scale1to7View" owner:self options:nil]; 
     [self addSubview:[v objectAtIndex:0]]; 
    } 
    return self; 
} 

이 대리자 즉시 영이된다 제대로 객체와보기도 표시 때의 펜촉에서 개체로드를 생성하고 값을 할당하려는 시도를 무시합니다.

이유가 누구인지 알 수 있습니까?

미리 감사드립니다.

+0

Nib를 사용하는 서브 클래스? 제발 당신이 사용자 정의 하위 클래스를 사용하고있는 코코아 콩에서보기입니까? xib 안의 설정은 무엇인가? – Rakesh

+0

@Rakesh : UILabel 및 UIButtons와 같은 일부 UI 컨트롤이 있고 다른보기 컨트롤러에서이 뷰를 다시 사용하고 싶습니다. 문제가 발생하면보기를 인스턴스화하고 대리자 및 일부 다른 속성을 컨트롤로 설정하지만 모든 컨트롤 참조가 NULL이되지 않습니다. –

답변

3

여러보기 컨트롤러에 대해 동일한 xib를 다시 사용할 수 없습니다. 해당 뷰를 다시 사용하려면 UIView에서 상속받은 클래스를 만들어 코드를 추가하십시오.

#import "SomeProtocol.h" 

@interface MyCustomView : UIView { 
    IBOutlet UIView *headerView; 
    IBOutlet UIView *footerView; 
    IBOutlet UIButton *updateBtn; 
} 

@property (nonatomic, assign) id<SomeProtocol> delegate; 

@end 

............ 

@implementation BCFirmwareView 

@synthesize delegate = _delegate; 

+ (id)viewFromNibWithName: (NSString*)name { 
    UIView *view = nil; 
    NSArray *views = [[NSBundle mainBundle] loadNibNamed: name owner: self options: nil]; 
    if (views) { 
     for (UIView *aView in views) { 
      if ([aView isKindOfClass: NSClassFromString(name)]) 
       view = aView; 
     } 
    } 

    return view; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder: aDecoder]; 

    if (self) { 
    } 

    return self; 
} 

- (id)init { 
    self = [[MyCustomView viewFromNibWithName: @"MyCustomView"] retain]; 
    if (self) { 
    } 

    return self; 
} 

- (void)dealloc { 
    self.delegate = nil; 

    [headerView release]; 
    [footerView release]; 
    [updateBtn release]; 

    [super dealloc]; 
} 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    // Do any additional setup after loading the view from its nib. 

    headerView.backgroundColor = [UIColor redColor]; 
    footerView.backgroundColor = [UIColor greenColor]; 
} 

- (void)willMoveToSuperview:(UIView *)newSuperview { 
    [super willMoveToSuperview: newSuperview]; 

    if (!newSuperview) 
     return; 
} 

- (void)didMoveToSuperview { 
    [super didMoveToSuperview]; 
} 

- (IBAction)updateBtnPressed: (id)sender { 
// do some stuff 
} 

@end 

다음 단계는 인터페이스 빌더에서 xib를 열고 클래스를 파일의 응답자가 아닌보기의 사용자 정의 클래스로 설정하는 것입니다. 보기를 마우스 오른쪽 단추로 클릭하고 콘센트 및 작업 연결을 만듭니다.

make the outlet and actions connections for the view

change the custom class for the view

지금 당신은 단순히 어떤 뷰 컨트롤러에 MyCustomView의 인스턴스를 만들어 사용하실 수 있어야합니다. 보기 사용자 정의 클래스를 클래스로 변경하는 것을 잊지 않는 경우 Interface Builder에서도 작동합니다.

0

Xib를 사용하여 사용자 지정 UIView를 만들고 속성을 추가 할 수 있습니다. 그런 다음 클래스를 xib에 연결하고 속성을 IB에 연결합니다.

또는 당신은 단지

NSArray *v = [[NSBundle mainBundle] loadNibNamed:@"Qus_Scale1to7View" owner:self options:nil]; 

UIView *view = [v objectAtIndex:0]; 

를 사용하고 viewWithTag 사용하여 객체의 값을 설정할 수 있습니다 방법.

UILabel *label = (UILabel *)[view viewWithTag:yourTag]; 

이 정보가 도움이되는지 알려주세요.

관련 문제