Domanda

Ho letto la guida "La tua prima applicazione iOS" di Apple e tutto quello che c'è sembra di cristallo chiaro per me. Tuttavia, quando cerco di capire come modello di applicazione iOS-based View fornito in XCode funziona, mi imbatto in alcuni enigmi interessanti.

Capisco che l'applicazione ottiene il nome del file pennino principale (di solito, la MainWindow.xib) formano il file * -Info.plist. Quello che non capisco è, come fa il know XCode quale file pennino è associato con il controller che si crea con questo modello di applicazione Visualizza-based per impostazione predefinita. Nella guida, si inizia con l'applicazione Window-based, e si "devono scrivere" qualcosa di simile:

MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

[self setMyViewController:aViewController];

, che ha perfettamente senso. Tuttavia, si scopre che nel modello di applicazione iOS Visualizza-based non v'è nulla di simile, e che questa specifica pennino non è stato effettivamente necessario, in primo luogo, fino a quando è stato creato il sottoclasse UIViewController con l'opzione "Con XIB per l'interfaccia utente "controllato. La mia domanda è, come fa XCode sapere quale pennino è associato con questo controller, vale a dire è che memorizza questa connessione in alcuni dei file, o forse da una sorta di convenzione (stesso nome per controller e file nib, forse)? Inoltre, dove che 'caricato da 'MyViewBasedAppController'' sottotitolo provengono da punto di vista di Interface Builder di controllo all'interno MainWindow.xib? Non c'è sicuramente quando aggiungo il controller a mano, quindi sono curioso di ciò che la magia non XCode fare dietro la schiena, quando penso che sto solo selezionando un modello semplice codice.

È stato utile?

Soluzione

Se si guarda in informazioni di destinazione (doppio click sul bersaglio per portare che fino), scheda 'Proprietà' vedrete il nome del file principale pennino. Le parole 'pennino' e 'Xib' sono intercambiabili per questi scopi; Xib è solo una nuova alternativa per il pennino.

Sarà 'MainWindow' fresco dal modello. Se si apre MainWindow.xib vedrai che lì dentro è un oggetto chiamato '[nome del progetto] App delegato', e se si mostra la finestra di ispezione e di controllo sotto la scheda 'i' vedrete il tipo di classe che è chiamato in alto. Se si seleziona la scheda connessioni (la freccia rivolta verso destra), vedrete che il file proprietario (che è l'UIApplication stesso) ha la sua proprietà 'delegato' collegato.

Si vedrà anche che ha una presa chiamato 'viewController'. Che è collegato ad un altro oggetto nella XI ter chiamato '[nome del progetto] View Controller'. Controllare il tipo su questo e vedrete che è il tipo di controller della vista che Xcode ha aggiunto al progetto. Guardando i suoi attributi (la prima scheda della finestra di ispezione, con l'immagine di scorrimento), si vedrà anche che un file pennino in parte è specificato come contenente i dettagli principali.

Per l'amor di discussione, supponiamo che ho chiamato il mio progetto 'NibTest' e ho fatto alcuna modifica.

In fase di runtime, i carichi dispositivo Info.plist. In lì si vede che il delegato è di tipo NibTestAppDelegate. Così sarà istanziare un'istanza della classe NibTestAppDelegate e impostare la proprietà delegato del UIApplication ad esso.

Sarà quindi vedere dal MainWindow.nib che NibTestAppDelegate ha un membro denominato viewController di tipo NibTestViewController. Così si creerà un'istanza di questo e impostare la proprietà viewController nell'istanza NibTestAppDelegate appena creato ad esso.

Nel fare che si aprirà l'altro XI ter e continuare a fare lo stesso tipo di operazioni.

Objective-C ha un runtime completamente riflettente, in modo da poter istanze di oggetti con il loro nome di classe in fase di esecuzione. Questa è una delle differenze tra Objective-C e C ++, per esempio.

Xcode non genera alcun codice nascosto o fare affidamento su eventuali convenzioni di denominazione nascosti. Il tutto è capito in fase di esecuzione da parte del sistema operativo.

EDIT: per esempio, al posto del tuo esempio:

    MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Si potrebbe effettivamente fare:

    MyViewController *aViewController = [[NSClassFromString(@"MyViewController") alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];

Saranno funzionano in modo identico finché esiste MyViewController nel programma o nel runtime più ampia.

Si potrebbe in alternativa, passare qualsiasi altro oggetto stringa vi piace NSClassFromString. Anche chiedere all'utente se si vuole (anche se sarebbe una pessima idea per motivi di sicurezza).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top