wake-up-neo.com

Führen Sie Segue für ViewDidLoad aus

In iOS 5 habe ich ein Storyboard mit einem modalen View-Controller, den ich anzeigen möchte, wenn es der Benutzer das erste Mal in der App ist. Danach möchte ich diesen View-Controller überspringen.

Ich setze einen NSDefault-Schlüssel, um dieses Problem zu lösen. Wenn ich jedoch nachschaue, ob dies festgelegt ist, und dann mit performSegueWithIdentifier das Segment einleitet, passiert nichts. Wenn ich diese Auswahl hinter einen Button stecke, funktioniert das gut ...

56
adam0101

Ich habe eine ähnliche Frage beantwortet, bei der der Entwickler beim Start einen Anmeldebildschirm anzeigen wollte. Ich habe für ihn einen Beispielcode zusammengestellt, den hier herunterladen kann. Der Schlüssel zum Lösen dieses Problems ist das Aufrufen von Dingen zum richtigen Zeitpunkt. Wenn Sie diesen neuen View-Controller anzeigen möchten, sehen Sie in dem Beispiel, dass Sie so etwas verwenden müssen

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];

    [self presentModalViewController:vc animated:YES];
}

Ich habe auch eine Erklärung dazu, wie Segues und Storyboards funktionieren. hier

47
Scott Sherwood

Beim Laden in ViewDidLoad wurde "Under-Layer" zum Blinken gebracht. Ich habe dieses Problem gelöst, indem ich mein Storyboard programmatisch geladen habe. Lassen Sie dieses Feld unter Ziel/Haupt-Storyboard leer. Dann füge folgendes hinzu:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    // Load Main App Screen
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    HomeScreenVC *homeScreenVC = [storyboard instantiateInitialViewController];
    self.window.rootViewController = homeScreenVC;
    [self.window makeKeyAndVisible];

    // Load Login/Signup View Controller
    UIViewController *mainLoginVC = [storyboard instantiateViewControllerWithIdentifier:@"MainLoginVC"];
    [mainLoginVC setModalPresentationStyle:UIModalPresentationFullScreen];
    [homeScreenVC presentModalViewController:mainLoginVC animated:NO];

    return YES;
}
42
bearMountain

Das Problem ist, dass Sie der Hierarchie eine zweite Ansicht hinzufügen, bevor die erste vollständig hinzugefügt wird. Versuchen Sie, Ihren Code in einzufügen:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    // Present your modal from here
}

Nachdem [super viewDidAppear] aufgerufen wurde, haben Sie eine vollständig geladene Ansicht, die Sie ändern können.

22
NJones

Es gibt kein Hauptproblem bei der Ausführung von Abschnitten in viewDidLoad (nach dem Aufruf von super natürlich).

Das Problem besteht darin, Segmente auszuführen, bevor das Fenster der Anwendung sichtbar wird. Der UIViewController, den Sie anzeigen möchten, ist Teil des Haupt-Storyboards, sodass er in den Arbeitsspeicher geladen wird, bevor die App ihren Code im App-Delegaten ausführt. In Ihrem Fall wird viewDidLoad von iOS aufgerufen, bevor das Anwendungsfenster die folgende Meldung erhält: MakeKeyAndVisible.

Der wichtige Teil ist die Sichtbarkeit. Das Durchführen eines Segues in einer Ansichtshierarchie, in der das Fenster nicht sichtbar ist, tut nichts!

Sie können versuchen, so etwas zu tun:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// The window initialized with hidden = YES, so in order to perform the segue we need to set this value to NO.
// After this action, the OS will add the window.rootViewController's view as a subview of the window.
self.window.hidden = NO;

[self.window.rootViewController performSegueWithIdentifier:_IDENTIFIER_ sender:self.window.rootViewController];

// Now that the window is not hidden, we must make it key.
[self.window makeKeyWindow];
return YES;
}
11
EladWeinson

UPDATE: Diese Lösung funktioniert nicht mehr in iOS 8.

Ein korrekter Weg, um Ihr Problem zu lösen, ist das Auslösen des Modus der Segue/Present-Ansicht in der Delegatenmethode applicationDidBecomeActive: oder in einem Benachrichtigungshandler UIApplicationDidBecomeActiveNotification.

Apples Dokumentation rät eigentlich rät dasselbe :

Wenn sich Ihre App zuvor im Hintergrund befunden hat, können Sie sie auch zum Aktualisieren der Benutzeroberfläche Ihrer App verwenden.

Diese Lösung hat den Vorteil, dass sie mit dem Main Storyboard-Lademechanismus funktioniert, sodass Sie nichts manuell laden und unnötigen Code schreiben müssen.

Ich verwende diese Lösung erfolgreich unter iOS 6.1, 7.0 und 7.1 und sollte unter iOS 5 funktionieren.

10
Leon Deriglazov

So habe ich es in Swift gemacht. Dies verbirgt auch den View Controller.

override func viewWillAppear(animated: Bool) {
    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        self.view.hidden = true
    } else {
        self.view.hidden = false
    }
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(true)

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults()

    let isloggedIn = prefs.objectForKey("isLoggedIn") as? Bool
    if (isloggedIn != false) {
        println("this should work")
        self.performSegueWithIdentifier("Login", sender: self)
    }
}
5
Surge Pedroza

Für Swift:

dispatch_async(dispatch_get_main_queue()) {
   self.performSegueWithIdentifier("toView2", sender: self)
}

Für Swift 3:

DispatchQueue.main.async {
    self.performSegueWithIdentifier("toView2", sender: self)
}
5
pbaranski

Swift 3

override func viewWillAppear(_ animated: Bool) {
    if authPreference.isExist() == true {
        self.view.isHidden = true
    } else {
        self.view.isHidden = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)

    if authPreference.isExist() == true {
        navigateToSegue()
    }
}
2
Jaseem Abbas

Ich hatte das gleiche Problem. Bevor ich diese Frage fand, habe ich dieses Problem gelöst, indem ich async im Hauptthread verwendete. Auf diese Weise wird dieser Code direkt nach dem Erstellen der Ansicht vom UI-Thread aufgerufen. 

dispatch_async(dispatch_get_main_queue(), ^{
        [self performSegueWithIdentifier:@"segueAlbums" sender:self];
    });

Dieser Code kann in der viewDidLoad-Methode aufgerufen werden.

1
GuillermoMP

Aktualisiert für Swift 3

Mit dem folgenden Code-Snippet können Sie den gewünschten viewController laden. In meinem Fall war es ein TabBarController, wenn der Benutzer ein gültiges Facebook-Login-Token hatte. Der Vorteil dieser Lösung gegenüber der anderen Swift 3-Lösung besteht darin, dass sie ohne Flimmern des Bildschirms sofort auftritt.

func applicationDidBecomeActive(_ application: UIApplication) {
    if FBSDKAccessToken.current() != nil {
        self.window?.rootViewController?.present((self.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "TabBarController"))!, animated: false, completion: nil)           
    }
}
1

Die beste Lösung ist dies zu tun:

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];    
    [self performSegueWithIdentifier:@"NameSegue" sender:self];
}
0
nhegroj

Ich habe @bearMountain answer für Swift 3 angepasst.

func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    let yourInitialVC: UIViewController? = storyboard.instantiateViewController(withIdentifier: "TermsVC")
    window?.rootViewController = termsVC
    window?.makeKeyAndVisible()
    return true
}
0
Nathan Barreto