3 Stimmen

Wie man eine universelle iPhone/iPad-App OHNE DAS TEILEN VON ANSICHTEN erstellt?

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

5voto

Tricertops Punkte 8462

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.

2voto

holex Punkte 23884

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X