Ich merke, dass es hier viele Fragen dazu gibt, wie man universelle Apps erstellt, aber nicht so viele darüber, wie man eine universelle App erstellt, die völlig unterschiedliche Ansichten und Funktionen hat. Ich möchte, dass der Benutzer eine App herunterladen kann, aber jede Version ist völlig anders. Ist der einzige Weg, dies zu tun, if-Anweisungen zu verwenden, um zu erkennen, welches Gerät der Benutzer hat, und dann die richtigen Ansichtscontroller von dort aus zu laden (z.B. im Delegierten, den richtigen ersten Ansichtscontroller laden)? Danke
Antworten
Zu viele Anzeigen?Im Grunde genommen möchten Sie „zwei verschiedene Apps in einer einzelnen Binärdatei bereitstellen“. Falls Sie bereits zwei Apps haben, die keine Klassennamen teilen (oder andere Objektnamen der obersten Ebene), sollte das ziemlich einfach sein.
Sie sollten gerätespezifischen Code so früh wie möglich ausführen und das geschieht in main.m
. Übergeben Sie verschiedene App Delegate-Klassen für das iPhone und das iPad. Der Rest sollte wie gewohnt funktionieren und es sollten keine Klassen des anderen „Geräts“ verwendet werden.
int main(int argc, char * argv[]) {
@autoreleasepool {
UIUserInterfaceIdiom idiom = [[UIDevice currentDevice] userInterfaceIdiom];
Class appDelegateClass = Nil;
if (idiom == UIUserInterfaceIdiomPhone) {
appDelegateClass = [iPhoneAppDelegate class];
}
else if (idiom == UIUserInterfaceIdiomPad) {
appDelegateClass = [iPadAppDelegate class];
}
NSCAssert(appDelegateClass, @"Unerwartetes Idiom! Vielleicht eine iWatch?");
return UIApplicationMain(argc, argv, nil, appDelegateClass));
}
}
Sie könnten auch einen anderen Aufteilungspunkt wählen, zum Beispiel die Zuweisung eines unterschiedlichen Root-View-Controllers.
Falls Sie trotzdem Code teilen möchten, können Sie einfach universelle Superklassen erstellen, zum Beispiel könnten iPhoneAppDelegate
und iPadAppDelegate
eine Superklasse AppDelegate
haben, die Benachrichtigungen oder URL-Handhabung übernimmt.
Das ist nur die grundlegende universelle Abschluss-Startmethode des Apple-Projekts:
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
...aber du kannst unterschiedliche Ansichtscontroller für unterschiedliche Benutzeroberflächen-Idiome laden:
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.window.rootViewController = [[UIPhoneVersionViewController alloc] initWithNibName:@"UIPhoneVersionViewController" bundle:nil];
} else {
self.window.rootViewController = [[UIPadVersionViewController alloc] initWithNibName:@"UIPadVersionViewController" bundle:nil];
}
[self.window makeKeyAndVisible];
return YES;
}
...und voilà, die Arbeit ist erledigt.