2011-08-25 2 views
1

해당보기에 대한 인터페이스가 포함 된 xim 파일에서로드하는 사용자 정의 UIView 클래스를 작성하려고합니다.사용자 정의 UIView에 대한 init 및 xib에서로드에 대한 질문

  1. 이가 수용 가능한 방법입니다

    - (id)init 
    {  
        self = [super init]; 
        if (self) 
        { 
         NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"LoadingV" owner:self options:nil]; 
         self = [(LoadingV*)[nibViews objectAtIndex: 0] retain]; 
        } 
        return self; 
    } 
    

    내가 알고 싶은 다음과 같이 내 사용자 지정보기의 init 메소드 내에서 [NSBundle mainBundle] loadNibNamed ...]을 캡슐화하는 것을 시도하고있다 그렇게하는거야? 더 좋은 방법이 있습니까?

  2. dealloc에서 [self release]를 호출하지 않는다는 가정하에 "retain"을 유지해야합니까?

건배 AF

답변

7

아니,이 허용되지 않습니다, 그것은 나쁜 관행 그리고 당신은 거기에 실제로 메모리 누수가.

더 나은 방법은 "공장"이라는 패턴을 사용하는 것입니다.

예 :

@interface CustomView: UIView 
@end 

@implementation CustomView 
- (void)awakeFromNib { 
    // custom view loaded from nib 
} 
@end 

@interface UIView (Nib) 
+ (UIView *)viewFromNib:(NSString *)nibName bundle:(NSBundle *)bundle; 
@end 

@implementation UIView (Nib) 
+ (UIView *)viewFromNib:(NSString *)nibName bundle:(NSBundle *)bundle { 
    if (!nibName || [nibName length] == 0) { 
     return nil; 
    } 

    UIView *view = nil; 

    if (!bundle) { 
     bundle = [NSBundle mainBundle]; 
    } 

    // I assume, that there is only one root view in interface file 
    NSArray *loadedObjects = [bundle loadNibNamed:nibName owner:nil options:nil]; 
    view = [loadedObjects lastObject]; 

    return view; 
} 
@end 

사용법 : 응답

// CustomView.xib contains one View object with its class set to "CustomView" 
CustomView *myView = (CustomView *)[UIView viewFromNib:@"CustomView" bundle:nil]; 
+0

감사합니다. UR 공장 기능에서 사용하는 논리 UR은 내가 가지고있는 것과 거의 비슷합니다 (보유를 제거해야만). 그러나 ur 함수는 자신에게 연관되지 않는 Class 메서드입니다. 다른 멤버 함수를 호출하는 사용자 정의 뷰의 객체가 필요할 경우 어떻게해야합니까? – Abolfoooud

+0

UIView에는 사용자 정의 할 수있는 'awakeFromNib' 메소드가 있습니다. –

+0

awakeFromNib는 xin에서 사용자 지정보기를로드하려고 할 때 유용하지 않습니다. 그 부름은 아직 불려지지 않았을 것입니다! – Abolfoooud

관련 문제