Sono consapevole che questa domanda è stata posta prima, ma le risposte sono contraddittorie e io sono confuso, quindi per favore non scottarmi.Modo corretto per caricare un pennino per una sottoclasse UIView
Desidero avere una sottoclasse riutilizzabile UIView
nella mia app. Voglio descrivere l'interfaccia usando un file pennino.
Ora diciamo che è una vista di indicatore di caricamento con un indicatore di attività in esso. Vorrei che in alcuni eventi istanziare questa vista e animare la vista di un controller di visualizzazione. Potrei descrivere l'interfaccia della vista senza problemi a livello di codice, creando gli elementi a livello di codice e impostando la loro cornice all'interno di un metodo init ecc.
Come posso farlo usando un pennino però? Mantenimento delle dimensioni fornite nel generatore di interfacce senza dover impostare una cornice.
sono riuscito a fare in questo modo, ma sono sicuro che sia sbagliato (è solo una vista con un selettore in esso):
- (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 io sono sovrascrivere sé, e quando L'ho istanziato:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Devo impostare manualmente il frame anziché averlo raccolto da IB.
MODIFICA: desidero creare questa vista personalizzata in un controller di visualizzazione e avere accesso per controllare gli elementi della vista. Non voglio un nuovo controller di visualizzazione.
Grazie
EDIT: Non so se questo è delle migliori pratiche, sono sicuro che non lo è, ma questo è come 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) {
}];
pratica corretta ancora desiderato
Se ciò è stato fatto utilizzando un controller di visualizzazione e init con il nome del pennino? Dovrei aver impostato il pennino in qualche metodo di inizializzazione UIView nel codice? O è quello che ho fatto ok?
Ma non è la prima riga di codice quasi uguale a quella utilizzata nella domanda originale in 'InitWithDataSource'? In ogni caso questo funzionerà anche se si dà il proprietario come 'Nil'. – Rakesh
Vale la pena notare che in questi giorni nel 99,9999% dei casi, si userebbero solo ** view container **, che ora vengono utilizzati ovunque e sempre in iOS. [how-to article] (http://stackoverflow.com/a/23403979/294884) – Fattie
nota a margine che è possibile sostituire [NSString stringWithFormat: @ "% @", [FSASelectView class]] con NSStringFromClass ([Classe FSASelectView]) – naomimichiko