Je sais que cette question a déjà été posée mais les réponses sont contradictoires et je suis confuse, alors ne m'enflammez pas.
Je souhaite avoir une UIView
sous-classe réutilisable dans mon application. Je veux décrire l'interface à l'aide d'un fichier nib.
Disons maintenant que c'est une vue d'indicateur de chargement avec un indicateur d'activité. Je voudrais sur un événement pour instancier cette vue et l'animer dans la vue d'un contrôleur de vue. Je pourrais décrire l'interface de la vue sans problème par programme, en créant les éléments par programme et en définissant leur cadre dans une méthode init, etc.
Comment puis-je faire cela en utilisant une pointe? Conserver la taille indiquée dans le générateur d'interface sans avoir à définir un cadre.
J'ai réussi à le faire comme ça, mais je suis sûr que c'est faux (c'est juste une vue avec un sélecteur):
- (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 moi-même 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 régler manuellement le cadre plutôt que de le récupérer auprès d'IB.
EDIT: Je souhaite créer cette vue personnalisée dans un contrôleur de vue et avoir accès pour contrôler les éléments de la vue. Je ne veux pas de 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 voici comment 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 est toujours souhaitée
Cela aurait-il dû être fait en utilisant un contrôleur de vue et init avec le nom de la nib? Dois-je avoir défini la pointe dans une méthode d'initialisation UIView dans le code? Ou ce que j'ai fait est-il correct?
initWithDataSource
? Quoi qu'il en soit, cela fonctionnera même si vous donnez au propriétaire la valeur «Nil».