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"
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.
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];
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
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:
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];
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)
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!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