3 votes

Charger UIView avec Nib et la classe UIView

J'ai essayé ce cours

https://github.com/autresphere/ASDepthModal

Je veux qu'il s'affiche comme il le fait, mais je veux être en mesure de définir les étiquettes par programme, car j'ai besoin qu'elles changent en fonction du jour que nous sommes. J'utilise storyboard, j'ai donc créé un .xib, uiview.h et uiview.m. Dans mon UIViewController principal, j'ai.. :

xibContents = [[NSBundle mainBundle] loadNibNamed:@".xib" owner:self options:nil];
testView = [xibContents lastObject];

Dans mon .xib, j'ai défini le propriétaire du fichier à ma classe uiview, ce qui crée un problème : NSUnknownKeyException. Lorsque j'ai défini le propriétaire du fichier dans mon .xib à ma classe uiview, l'application se charge et je peux l'ouvrir comme il se doit, mais je ne suis pas en mesure de changer l'état de l'étiquette par programme ? Je suis complètement perdu !

3voto

James Points 2141

En règle générale, les UIViews n'ont pas accès aux IBOutlets. Apple a en quelque sorte prévu que les xibs ne soient attribués qu'aux UIViewControllers.

Cependant, vous pouvez charger une vue à partir d'un xib de deux façons :

1) Créez un xib supplémentaire à utiliser dans votre UIViewController. Définissez le propriétaire du fichier à votre contrôleur de vue, et le nom de la classe de la vue à votre classe de vue personnalisée. Dans Interface Builder, cela se trouve sous "custom class". Vous pouvez définir la vue comme un IBOutlet, et iOS créera une instance de votre classe personnalisée lorsque votre UIViewController chargera le fichier xib et se définira comme propriétaire (comme vous l'avez essayé ci-dessus, mais uniquement à partir d'une classe de contrôleur).

2) Chargez un xib dans une classe UIView, et définissez self sur l'objet résultant :

- (id)init {
    self = [super initWithFrame:CGRectMake(0, 0, 1024, 352)];

    if (self) {
        NSArray* nib = [[NSBundle mainBundle] loadNibNamed:@"TCSNumberKeyPad" owner:self options:nil];
        [[nib objectAtIndex:0] setFrame:CGRectMake(0, 0, 1024, 352)];
        self = [nib objectAtIndex:0];
    }

    return self;
}

Dans un cas comme dans l'autre, vous devrez récupérer votre étiquette via le code plutôt que via les propriétés de l'IBOutlet. Vous pouvez trouver votre étiquette dans la propriété subviews :

UILabel* myLabel = [self.subviews objectAtIndex:0];

2voto

rostgaard Points 195

J'ai réussi à le faire fonctionner. J'ai pris la mauvaise approche. J'ai trouvé plus simple de créer simplement la vue et de la remplir avec l'image de fond et les étiquettes lorsque le bouton est cliqué. Il aurait été simple de le faire avec un concepteur d'interface utilisateur, mais ce n'était pas si difficile en fait.

Merci aux personnes qui m'ont aidé :)

1voto

isaach1000 Points 1789

Le propriétaire du fichier doit être le contrôleur de la vue, et non la vue elle-même. La vue peut avoir des points de vente sur les étiquettes. La vue doit être définie comme votre classe personnalisée dans votre NIB.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X