Question

Je crée une vue personnalisée en contact de cacao qui est superclassed par UIView et dans mon contrôleur principal que je l'initialiser puis l'ajouter en tant que sous-vue à la vue principale, mais quand je l'ajoute à la vue principale, il appelle ma initialiseur méthode à nouveau et provoque une boucle infinie. Est-ce que je vais à créer mon point de vue personnalisée ne va pas? Voici le 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];
}

et 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;
}
Était-ce utile?

La solution

Pourquoi avez-vous mis la déclaration de [super init] à la fin de l'initialiseur? Lorsque le sous-classement, vous mettez habituellement cette déclaration au début de la méthode.

UIView sous-classes , l'initialiseur désigné lors de la création de vues dans le code est initWithFrame:, vous devriez l'appeler avant d'ajouter l'étiquette et l'image. Vous pouvez utiliser l'image pour calculer le cadre nécessaire à la vue personnalisée.

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

Si vous avez encore une boucle infinie, mettre en pause le débogueur et rechercher le modèle de méthode récurrente dans la trace de la pile. Ce modèle vous donne la volonté où le code entre dans la boucle infinie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top