2010-06-07 2 views
5

UIView에서 수퍼 클래스로 분류 된 사용자 정의보기를 코코아 터치로 만들고 내 주 컨트롤러에서 기본보기로 만든 다음 기본보기에 하위보기로 추가합니다.하지만 추가 할 때 기본 뷰는 다시 initializer 메서드를 호출하고 무한 루프를 발생시킵니다. 사용자 정의보기를 잘못 작성하려고합니까? 다음은 MAINVIEWCocoa Touch : 사용자 정의보기 만들기 및 추가

- (void)loadView { 
    UIImage* tempImage = [UIImage imageNamed: @"image1.jpg"]; 
    CustomImageContainer *testImage = [[CustomImageContainer alloc] initWithImage: tempImage andLabel: @"test image" onTop: true atX: 10 atY: 10]; 
    [self.view addSubview: testImage]; 
} 

과 CustomImageContainer입니다

-(CustomImageContainer *) initWithImage: (UIImage *)imageToAdd andLabel: (NSString *)text onTop: (BOOL) top atX: (int) x_cord atY: (int) y_cord{ 
    UIImageView *imageview_to_add = [[UIImageView alloc] initWithImage: imageToAdd]; 
    imageview_to_add.frame = CGRectMake(0, 0, imageToAdd.size.width, imageToAdd.size.height); 
    UILabel *label_to_add = [[UILabel alloc] init]; 
    label_to_add.text = text; 
    label_to_add.alpha = 50; 
    label_to_add.backgroundColor = [UIColor blackColor]; 
    label_to_add.textColor = [UIColor whiteColor]; 
    [self addSubview: imageview_to_add]; 
    self.frame = CGRectMake(x_cord, y_cord, imageToAdd.size.width, imageToAdd.size.height); 
    if (top) { 
     label_to_add.frame = CGRectMake(0, 0, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height); 
     //[self addSubview: label_to_add]; 
    } 
    else { 
     label_to_add.frame = CGRectMake(0,.2 * imageview_to_add.frame.size.height, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height); 
    } 
    [self addSubview: label_to_add]; 
    [super init]; 
    return self; 
} 

답변

1

왜 이니셜의 끝에서 [super init] 문을 넣어 않았다? 서브 클래 싱하는 경우 일반적으로이 문을 메서드의 시작 부분에 넣습니다.

UIView 하위 클래스의 경우 코드에서보기를 만들 때 지정된 초기화 프로그램이 initWithFrame:이므로 레이블과 이미지를 추가하기 전에이를 호출해야합니다. 이미지를 사용하여 사용자 정의보기에 필요한 프레임을 계산할 수 있습니다.

-(CustomImageContainer *) initWithImage: (UIImage *)imageToAdd andLabel: (NSString *)text onTop: (BOOL) top atX: (int) x_cord atY: (int) y_cord{ 
    // The view will gets its frame to the size of the image 
    UIImageView *imageview_to_add = [[UIImageView alloc] initWithImage: imageToAdd]; 

    // Call the designated initializer 
    CGRect frame = CGRectMake(x_cord, y_cord, imageToAdd.size.width, imageToAdd.size.height); 
    self = [super initWithFrame:frame]; 

    [self addSubview: imageview_to_add]; 

    UILabel *label_to_add = [[UILabel alloc] init]; 
    label_to_add.text = text; 
    label_to_add.alpha = 50; 
    label_to_add.backgroundColor = [UIColor blackColor]; 
    label_to_add.textColor = [UIColor whiteColor]; 

    if (top) { 
     label_to_add.frame = CGRectMake(0, 0, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height); 
    } 
    else { 
     label_to_add.frame = CGRectMake(0,.2 * imageview_to_add.frame.size.height, imageview_to_add.frame.size.width, imageview_to_add.frame.size.height); 
    } 
    [self addSubview: label_to_add]; 

    return self; 
} 

무한 루프가 계속 발생하면 디버거를 일시 중지하고 스택 추적에서 반복 패턴 패턴을 검색하십시오. 이 패턴은 코드가 무한 루프에 들어가는 위치를 알려줍니다.

+0

Thansk 이것은 문제의 일부 였고, 다른 부분은 viewDidLoad가 아닌 loadView에 있었지만 엄청나게 감사했습니다. – AgentRegEdit

관련 문제