Domanda

I creare una vista personalizzata in contatto cacao che è superclasse da UIView e nel mio controller principale inizializzo e poi aggiungerlo come una visualizzazione secondaria alla vista principale, ma quando lo aggiungo alla vista principale si chiama il mio initializer metodo nuovo e provoca un ciclo infinito. Sto andando a creare mio parere, errata personalizzato? Ecco il 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];
}

e il 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;
}
È stato utile?

Soluzione

Perché hai messo la dichiarazione [super init] al termine della inizializzazione? Quando sottoclasse, di solito si mette questa dichiarazione all'inizio del metodo.

UIView sottoclassi , l'inizializzatore designato quando la creazione di viste in codice è initWithFrame:, così si dovrebbe chiamare prima di aggiungere l'etichetta e l'immagine. È possibile utilizzare l'immagine per calcolare la cornice necessaria per la visualizzazione personalizzata.

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

Se avete ancora un loop infinito, mettere in pausa il debugger e cercare il modello di metodo di ricorrente nella traccia dello stack. Questa volontà modello vi dà in cui il codice entra nel ciclo infinito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top