【问题标题】:Cocoa Touch: Creating and Adding Custom ViewCocoa Touch:创建和添加自定义视图
【发布时间】:2010-06-07 15:40:39
【问题描述】:

我在 cocoa touch 中创建了一个由 UIView 超类的自定义视图,并在我的主控制器中初始化它,然后将其作为子视图添加到主视图,但是当我将它添加到主视图时,它会调用我的初始化方法再次并导致无限循环。我是否要创建错误的自定义视图? 这是主视图

- (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;
}

【问题讨论】:

    标签: cocoa-touch uiview custom-view


    【解决方案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;
    }
    

    如果仍有无限循环,请暂停调试器并在堆栈跟踪中搜索循环方法模式。此模式将告诉您代码进入无限循环的位置。

    【讨论】:

    • 谢谢这是问题的一部分,另一部分是我在 loadView 而不是 viewDidLoad 中有它,但这非常感谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多