Prezentowanie i odrzucanie kontrolera widoku modalnego

Czy ktoś może podać mi przykładowy kod, którego mogę użyć, aby najpierw przedstawić kontroler widoku modalnego, a następnie go odrzucić? To jest to, co próbowałem:

    NSLog(@"%@", blue.modalViewController);
    [blue presentModalViewController:red animated:YES];
    NSLog(@"%@", blue.modalViewController);
    [blue dismissModalViewControllerAnimated:YES];
    NSLog(@"%@", blue.modalViewController);
Ten kod jest w viewDidLoad ("blue "i" red " są podklasami UIViewController). Spodziewam się, że pokaże czerwony widok, a następnie natychmiast go ukryć, z jakąś animacją. Jednak ten fragment kodu przedstawia tylko widok modalny i nie odrzuca go. Jakiś pomysł? Pierwszy dziennik pokazuje "null", podczas gdy dwa pozostałe dzienniki pokazują
Inną kwestią jest to, że jeśli umieszczę ten kod w applicationDidFinishLaunching: czerwony widok nie pojawia się w ogóle, a wszystkie logi dostają " null"
Author: Suragch, 2009-10-07

6 answers

Po pierwsze, gdy umieścisz ten kod w applicationDidFinishLaunching, może się zdarzyć, że kontrolery utworzone z Interface Builder nie są jeszcze połączone z Twoją aplikacją (więc "czerwony" i "niebieski" nadal są nil).

Ale aby odpowiedzieć na Twoje początkowe pytanie, to co robisz źle, to to, że dzwonisz dismissModalViewControllerAnimated: na niewłaściwym kontrolerze! Powinno być tak:

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];

Zazwyczaj" czerwony "Kontroler powinien zdecydować się na zwolnienie się w pewnym momencie (może kiedy" anuluj" przycisk jest kliknięty). Następnie kontroler" czerwony " może wywołać metodę na self:

[self dismissModalViewControllerAnimated:YES];

Jeśli nadal nie działa, może to mieć coś wspólnego z faktem, że kontroler jest prezentowany w sposób animowany, więc możesz nie mieć prawa do odrzucenia kontrolera tak szybko po jego przedstawieniu.

 105
Author: Tom van Zummeren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-07 13:50:41

Najprostszym sposobem, który zmęczyłem się w xcode 4.52 było stworzenie dodatkowego widoku i podłączyć je za pomocą modal segue (sterowanie przeciągnij przycisk z widoku jeden do drugiego widoku, wybrał Modal). Następnie przeciągnij przycisk do drugiego widoku lub widoku modalnego, który utworzyłeś. Steruj i przeciągnij ten przycisk do pliku nagłówka i użyj połączenia akcji. Spowoduje to utworzenie IBaction w kontrolerze.plik M. Znajdź swój typ akcji przycisku w kodzie.

[self dismissViewControllerAnimated:YES completion:nil];
 13
Author: max,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 07:04:58

Swift

Aktualizacja dla Swift 3

Tutaj wpisz opis obrazka

Storyboard

Utwórz dwa kontrolery widoku z przyciskiem na każdym. Dla drugiego kontrolera widoku Ustaw nazwę klasy na SecondViewController, A ID storyboard na secondVC.

Kod

ViewController.swift

import UIKit
class ViewController: UIViewController {

    @IBAction func presentButtonTapped(_ sender: UIButton) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
        myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
        myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
        self.present(myModalViewController, animated: true, completion: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {

    @IBAction func dismissButtonTapped(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

Źródło:

 11
Author: Suragch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:59

PresentModalViewController:

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];

Closmodalviewcontroller:

[self dismissModalViewControllerAnimated:YES];
 9
Author: Jerry Thomsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-05 12:18:19

Swift

self.dismissViewControllerAnimated(true, completion: nil)

 3
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 16:20:37

Najprostszym sposobem na to jest użycie Storyboard i Segue.

Wystarczy utworzyć Segue z FirstViewController (nie Kontroler nawigacyjny) TabBarController do LoginViewController z interfejsem logowania i nazwać go "showLogin".

Utwórz metodę, która zwraca BOOL, aby sprawdzić, czy użytkownik zalogowany i/lub jego/jej sesja jest prawidłowa... najlepiej w aplikacji. Nazwij to isSessionValid.

Na Twoim FirstViewController.m nadpisuje metodę viewDidAppear jako follows:

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

    if([self isSessionValid]==NO){
        [self performSegueWithIdentifier:@"showLogin" sender:self];
    }
}

Następnie, jeśli użytkownik zalogował się pomyślnie, po prostu zamknij lub wyskakuj Kontroler LoginViewController, aby wyświetlić karty.

Działa w 100%! Mam nadzieję, że to pomoże!
 2
Author: Oscar Salguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 21:28:26