2016-12-11 1 views
2

J'ai ce dans le fichier MyClass.h:propriété IBInspectable n'a pas sa valeur initWithCoder: initialiseur

#import <UIKit/UIKit.h> 

IB_DESIGNABLE 

@interface MyClass : UIView 

@end 

et c'est le code du fichier .m:

-(void)awakeFromNib{ 
    [super awakeFromNib]; 

    NSLog(@"This works %lud",(unsigned long)self.max); 
} 

-(instancetype)initWithCoder:(NSCoder *)aDecoder{ 

    if ((self = [super initWithCoder:aDecoder])){ 

     NSLog(@"This doesn't work %lud",(unsigned long)self.max); 
    } 

    return self; 
} 

Dans la méthode awakeFromNib, j'obtiens une valeur correcte dans IB. Dans initWithCoder: j'obtiens cette valeur égale à zéro.

Quel est le moment approprié pour vérifier une valeur, définie dans IB, pour cette propriété?

C'est ainsi que je l'ai défini une propriété dans le fichier .m:

@interface MyClass() 

@property (nonatomic) IBInspectable NSUInteger max; 

@end 

Répondre

3

Vous semblez avoir répondu à votre propre question: awakeFromNib au lieu de initWithCoder:. awakeFromNib est plus tard, et à ce moment-là, les attributs d'exécution ont été définis.

Dans la vraie vie, bien sûr, vous ne vous soucieriez probablement pas de cette valeur jusqu'à ce que nous arrivions à viewDidLoad, ce qui est considérablement plus tard que les deux.

+0

Merci. Eh bien, je n'ai pas encore vraiment compris quelle serait la manière la plus pratique d'utiliser ma classe, mais l'idée était la suivante: 1) Faites glisser une vue vers un storyboard (et définissez sa classe personnalisée sur MyClass), 2) Entrez des valeurs des propriétés inspectables. Aussi basé sur ces propriétés, je génère du contenu supplémentaire dans ma vue personnalisée (tout n'est pas visuel défini dans IB). Donc, lors de l'initialisation de ma vue, j'ai besoin des valeurs de ces propriétés définies dans IB. Si vous avez des suggestions ou des conseils sur ce flux, je suis tout ouïe. :) – Whirlwind

+0

Ma réponse reste la même. Faites-le dans 'awakeFromNib', comme vous l'avez déjà déduit. Mais ce que je ferais, c'est attendre que le contrôleur de vue ait 'viewDidLoad'. C'est après que la vue a été créée mais avant qu'elle ne soit placée dans l'interface. Le contrôleur de vue a vraisemblablement une référence à cette vue afin qu'il puisse lui dire de finir de se configurer lui-même. – matt