Per universale - iPhone + iPad - le applicazioni è possibile specificare che diversi ONA carico su ogni piattaforma, sia nel target pannello Info o con l'aggiunta di NSMainNibFile~ipad
e NSMainNibFile~iphone
chiavi della vostra Info.plist
. In alternativa, è possibile aggiungere un NIB MainWindow~ipad.xib
alla destinazione, verrà caricato su iPad anziché su MainWindow.xib
, in base alla chiave NSMainNibFile
in Info.plist.
Se è necessario più controllo e personalizzazione per un'app universale, è possibile caricare manualmente la NIB iniziale. Il modello di progetto "Universale" ha il boilerplate per questo metodo, quindi il modo più rapido per iniziare a utilizzare questa tecnica è creare semplicemente un nuovo progetto iOS con il profilo Universal.
Negli esempi sopra il Main NIB File
si trova in Info.plist
(impostazioni di destinazione) in modo che si avrà già un pennino caricati quando il delegato applicazione viene chiamata. Di solito in questa configurazione viene archiviato anche un oggetto MyAppDelegate
nella NIB (con qualche IBOutlets
) e il NIB File's Owner
verrà impostato su UIApplication
.
Per un progetto universale in grado di supportare due layout alternativi, il tasto Main NIB File viene lasciato fuori da Info.plist
. Poi istanzia l'oggetto applicativo delegato programmazione in UIApplicationMain
:
#import "MYAppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MYAppDelegate class]));
}
}
quindi controllare l'ambiente e le impostazioni e caricare la NIB appropriato application:DidFinishLaunchingWithOptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
_window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
_viewController = [[[MYViewController alloc] initWithNibName:@"MYViewController_iPhone" bundle:nil] autorelease];
} else {
_viewController = [[[MYViewController alloc] initWithNibName:@"MYViewController_iPad" bundle:nil] autorelease];
}
_window.rootViewController = _viewController;
[_window makeKeyAndVisible];
return YES;
}
- (void)dealloc {
[_window release];
[_viewController release];
[super dealloc];
}
Il nuovo passo è quello di creare una radice MYViewController
manualmente, loading la NIB appropriata. In questa configurazione lo File's Owner
è il tuo nuovo splendente MYViewController
anziché UIApplication
. Se lo desideri, lo standard MYViewController
può adottare gran parte di ciò che potresti aver utilizzato per il delegato dell'applicazione, che spesso incapsula la classe del modello principale dell'app, funge da origine dati e delegato per le visualizzazioni e altre cose nella NIB.
Quindi ci si aspetta di avere qualche radice UIView
nel pennino, e dovrebbe essere collegato alla view
uscita del File's Owner
(MYViewController
).
Si noti che il NIB di MYViewController non viene effettivamente caricato fino al primo accesso alla proprietà MYViewController.view
. Solo allora sarà chiamato [MyViewController viewDidLoad]
! Il momento più probabile in cui ciò si verifichi è quando lo aggiungi alla finestra principale.
Nel codice modello mostrato sopra la radice UIWindow
viene creata un'istanza dal delegato dell'app, ma non c'è motivo per cui non sia possibile includerla nella NIB. Se scegli di farlo, fai attenzione. Se si imposta rootViewController
della finestra nella NIB sul proprietario del file in quel caso, la vista del controller verrà aggiunta alla finestra quando viene attivata la finestra. Fai attenzione a costruire quel primo NIB in ogni caso.
Il delegato dell'app non deve necessariamente avere un riferimento alla root UIWindow
se si desidera che MYViewController lo gestisca, ma potrebbe essere più pulito in generale per mantenere la root window fuori dai propri NIB e gestirla nell'app delegato .
Al di fuori di questo (!) Non c'è molto diverso dall'approccio a piattaforma singola.
che è giusto !, "didFinishLaunchingWithOptions" è il primo metodo da eseguire! –