2010-06-07 51 views
5

我创建了一个自定义视图,由UIView superclassed和我的主控制器初始化它,然后将其作为子视图添加到主视图,但是当我将它添加到它再次调用我的初始化方法的主视图并导致无限循环。我是否要创建我的自定义视图错误? 这里是MAINVIEW可可触摸︰创建和添加自定义视图

- (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这是问题的一部分,另一部分是我在loadView不是viewDidLoad,但这非常非常感谢你的帮助 – AgentRegEdit 2010-06-08 18:24:45