Quando è necessario utilizzare init:
e quando è necessario utilizzare initWithNibName:bundle:
durante la creazione di un controller di visualizzazione?Quando dovrei inizializzare un controller di visualizzazione usando initWithNibName?
risposta
-initWithNibName:bundle:
è l'inizializzatore designato per UIViewController. Qualcosa dovrebbe infine chiamarlo. Detto questo, e nonostante gli esempi di Apple (che favoriscono la brevità sulla manutenibilità in molti casi), non dovrebbe mai essere chiamato al di fuori del controller stesso.
Vedrete spesso il codice come questo:
MYViewController *vc = [[MYViewController alloc] initWithNibName:@"Myview" bundle:nil];
dico questo non è corretto. Mette i dettagli dell'implementazione (il nome della NIB e il fatto che persino un NIB è usato) nel chiamante. Questo rompe l'incapsulamento. Il modo corretto per farlo è:
MYViewController *vc = [[MYViewController alloc] init];
Poi, in MYViewController:
- (instancetype)init
{
self = [super initWithNibName:@"Myview" bundle:nil];
if (self != nil)
{
// Further initialization if needed
}
return self;
}
- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
NSAssert(NO, @"Initialize with -init");
return nil;
}
Questo sposta i dettagli di implementazione chiave in oggetto, e impedisce ai chiamanti di rottura accidentale incapsulamento. Ora, se si modifica il nome del NIB o si passa alla costruzione programmatica, lo si aggiusta in un punto (nel controller della vista) anziché in ogni punto in cui viene utilizzato il controller della vista.
Se questo è il modo previsto, perché XCode4 genera un initWithnibName: bundle: stub per ogni classe ViewController vuoto, eppure nessun metodo init? –
Lo stesso motivo per cui i modelli non hanno incluso prefissi di classe, anche se si suppone che si prefiggano prefissazioni alle classi e il modello crei il nome più stupido possibile per il delegato dell'app, che è un vero problema da risolvere. E IB impone una dichiarazione di ivar durante la creazione automatica delle proprietà, anche se non dovresti dichiarare ivars nel nuovo ABI. I modelli non sono sempre le migliori pratiche. Sono spesso il minimo comune denominatore che funziona un po 'nella maggior parte dei casi, ma da nessuna parte particolarmente bene. Il codice di esempio di Apple sta migliorando di recente, ma ha ancora una strada da percorrere. –
Se si segue la convenzione di denominare i propri pennini allo stesso modo della classe, questo codice funziona bene: '- (id) init { return [super initWithNibName: NSStringFromClass ([self class]) bundle: nil]; } ' – CharlesA
Utilizzare initWithNibName se si sta inizializzando con un file di pennino! Cioè, un file che hai creato usando Interface Builder.
Se non si utilizza IB per impaginare le viste, è sufficiente utilizzare init.
utilizzando init quando non è presente il file pennino/xib, ad es. UI sono creati da codifica
utilizzando initWithnibName, se abbiamo un pennino/XI ter o stessa quota di controllo di oltre l'1 pennino/XI ter
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
questo è quello che penso ..
Sapete se aggiungete ~ iphone o ~ ipad ai nomi dei pennini, potete semplicemente chiamare initWithNibName @ "ViewController" e sceglierà quello corretto. – Darxval
Si può solo chiama init, purché lo xib abbia lo stesso nome della classe del controller di visualizzazione. L'incapsulamento non è necessario. Ciò consente di risparmiare la digitazione, ma potrebbe non servire alla chiarezza.
NUDMainViewController *mainVC = [[NUDMainViewController alloc] init];
- 1. Tentativo di inizializzare un controller di visualizzazione dallo storyboard
- 2. Come caricare un altro controller di visualizzazione dal file di implementazione del controller di visualizzazione corrente?
- 3. Eliminazione di due controller di visualizzazione modali
- 4. Come dovrei inizializzare un boost :: array?
- 5. Rotazione iOS 6: attivazione di un controller di visualizzazione
- 6. ViewDidLoad viene chiamato prima di initWithNibName?
- 7. Dove dovrei inizializzare pg-promise
- 8. Un controller di visualizzazione presentato può anche essere un controller di visualizzazione presentante?
- 9. ios: come eliminare un controller di visualizzazione modale e quindi inserire un controller di visualizzazione spinto
- 10. initWithNibName non viene chiamato
- 11. Android: "Impossibile inizializzare il motore di visualizzazione"
- 12. Come rendere UITabBarController carica pigramente i controller di visualizzazione?
- 13. Ridimensiona i controller di visualizzazione principale e di dettaglio in un controller di visualizzazione divisa?
- 14. Collegamento di controller di visualizzazione figlio a un controller di visualizzazione padre nello storyboard
- 15. Visualizzazione vista controller in modalità modale vista controller
- 16. Come passare da un controller di visualizzazione a un altro controller di vista
- 17. swift - Inizializza il controller di visualizzazione dallo storyboard sovrascrivendo init
- 18. Quando dovrei usare l'inizializzazione uniforme?
- 19. 'Ho cercato di passare a un controller di visualizzazione che non esiste.'
- 20. Parametro che passa con initWithNibName:
- 21. iOS - apri il controller di visualizzazione iniziale
- 22. Perché dovrei usare i modelli di visualizzazione?
- 23. Transizione tra controller di visualizzazione, OS X
- 24. L'applicazione ha tentato di presentare un controller di visualizzazione modale nil sul target "Current View Controller"
- 25. Transizione del controller di visualizzazione interattiva dal controller di visualizzazione con barra di stato nascosta
- 26. Quando dovrei creare un distruttore?
- 27. Visualizzazione di un valore in un servizio da un controller
- 28. Quando un controller di visualizzazione viene eliminato, dovrebbe svuotare la memoria?
- 29. Quando dovrei usare un parser?
- 30. Come chiamare un controller di visualizzazione a livello di codice?
è necessario modificare la risposta selezionata su questa questione – Eric