Je suis conscient que cette question a déjà été posée, mais les réponses se contredisent et je ne sais plus où j'en suis, alors je vous prie de ne pas m'enflammer.
Je veux avoir une carte réutilisable UIView
dans toute mon application. Je veux décrire l'interface en utilisant un fichier nib.
Disons maintenant qu'il s'agit d'une vue d'indicateur de chargement avec un indicateur d'activité. Je voudrais qu'un événement instancie cette vue et l'anime dans la vue d'un contrôleur de vue. Je pourrais décrire l'interface de la vue sans problème de manière programmatique, en créant les éléments de manière programmatique et en définissant leur cadre dans une méthode init, etc.
Mais comment faire en utilisant une plume ? En conservant la taille donnée dans le constructeur d'interface sans avoir à définir un cadre.
J'ai réussi à faire comme ça, mais je suis sûr que c'est faux (c'est juste une vue avec un sélecteur dedans) :
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Mais j'écrase le self, et quand je l'instancie :
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Je dois définir manuellement le cadre plutôt que de le faire récupérer par IB.
EDIT : Je veux créer cette vue personnalisée dans un contrôleur de vue, et avoir accès au contrôle des éléments de la vue. Je ne veux pas d'un nouveau contrôleur de vue.
Merci
EDIT : Je ne sais pas si c'est la meilleure pratique, je suis sûr que ce n'est pas le cas, mais c'est comme ça que je l'ai fait :
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
Une pratique correcte toujours souhaitée
Aurait-il fallu utiliser un contrôleur de vue et init avec le nom de la nib ? Aurais-je dû définir la nib dans une méthode d'initialisation de UIView dans le code ? Ou est-ce que ce que j'ai fait est correct ?