Sono consapevole che questa domanda è stata posta in passato, ma le risposte sono contraddittorie e sono confuso, quindi per favore non incendiarmi.
Voglio avere una UIView
sottoclasse riutilizzabile in tutta la mia app. Voglio descrivere l'interfaccia usando un file pennino.
Supponiamo ora che sia una visualizzazione dell'indicatore di caricamento con un indicatore di attività. Vorrei su un evento per creare un'istanza di questa vista e animarla nella vista di un controller di visualizzazione. Potrei descrivere l'interfaccia della vista senza problemi a livello di codice, creando gli elementi in modo programmatico e impostando la loro cornice all'interno di un metodo di inizializzazione ecc.
Come posso farlo usando un pennino però? Mantenere le dimensioni fornite in Interface Builder senza dover impostare un frame.
Sono riuscito a farlo in questo modo, ma sono sicuro che sia sbagliato (è solo una vista con un selettore al suo interno):
- (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;
}
Ma sovrascrivo me stesso e quando ne creo un'istanza:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Devo impostare manualmente la cornice piuttosto che averla ripresa da IB.
EDIT: voglio creare questa visualizzazione personalizzata in un controller di visualizzazione e avere accesso per controllare gli elementi della visualizzazione. Non voglio un nuovo controller di visualizzazione.
Grazie
EDIT: Non so se questa sia la migliore pratica, sono sicuro che non lo sia, ma è così che l'ho fatto:
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) {
}];
La pratica corretta voleva ancora
Avrebbe dovuto essere fatto usando un controller di visualizzazione e un init con il nome del pennino? Avrei dovuto impostare il pennino in qualche metodo di inizializzazione UIView nel codice? O va bene quello che ho fatto?
initWithDataSource
? Comunque questo funzionerà anche se dai il proprietario come "Nullo".