Kann mir jemand den Beispielcode geben, mit dem ich zuerst einen Modal View Controller präsentieren und dann schließen kann? Das habe ich versucht:
NSLog(@"%@", blue.modalViewController);
[blue presentModalViewController:red animated:YES];
NSLog(@"%@", blue.modalViewController);
[blue dismissModalViewControllerAnimated:YES];
NSLog(@"%@", blue.modalViewController);
Dieser Code befindet sich in viewDidLoad ("blau" und "rot" sind beide Unterklassen von UIViewController). Ich gehe davon aus, dass ich die rote Ansicht anzeigen und sie dann sofort mit einigen Animationen ausblenden werde. Dieser Code zeigt jedoch nur die modale Ansicht und schließt sie nicht ab. Irgendeine Idee? Das erste Protokoll zeigt "null", während die beiden anderen Protokolle anzeigen<RedViewController: 0x3d21bf0>
Ein weiterer Punkt ist, wenn ich diesen Code in applicationDidFinishLaunching einfüge: Die rote Ansicht wird überhaupt nicht angezeigt und alle Protokolle erhalten "null".
ios
objective-c
uiviewcontroller
modal-view
Phunehehe
quelle
quelle
presentModalViewController:animated:
ist veraltet. Jetzt müssen SiepresentModalViewController:animated:completion:
die folgenden Operationen im Abschlussblock verwenden und ausführen (wenn Sie warten möchten, bis siered
angezeigt werden). Lesen Sie auf jeden Fall den Artikel, den @MatterGoal vorschlägt: developer.apple.com/library/ios/#featuredarticles/… .Antworten:
Wenn Sie diesen Code in applicationDidFinishLaunching einfügen, kann es zunächst vorkommen, dass vom Interface Builder instanziierte Controller noch nicht mit Ihrer Anwendung verknüpft sind (daher sind "rot" und "blau" immer noch vorhanden
nil
).Um Ihre erste Frage zu beantworten, machen Sie falsch, dass Sie
dismissModalViewControllerAnimated:
den falschen Controller anrufen ! Es sollte so sein:[blue presentModalViewController:red animated:YES]; [red dismissModalViewControllerAnimated:YES];
Normalerweise sollte der "rote" Controller beschließen, sich irgendwann zu entlassen (möglicherweise, wenn auf die Schaltfläche "Abbrechen" geklickt wird). Dann könnte der "rote" Controller die Methode aufrufen
self
:[self dismissModalViewControllerAnimated:YES];
Wenn es immer noch nicht funktioniert, hat es möglicherweise etwas damit zu tun, dass der Controller animiert dargestellt wird, sodass Sie den Controller möglicherweise nicht so schnell nach dem Präsentieren schließen dürfen.
quelle
[self dismissModalViewControllerAnimated:YES];
ist veraltetdismissModalViewControllerAnimated
anred
oderblue
? Aus den Dokumenten geht hervor, dass wir es anrufen solltenblue
(die präsentierende VC) ...Schnell
Aktualisiert für Swift 3
Storyboard
Erstellen Sie zwei View Controller mit jeweils einer Schaltfläche. Setzen Sie für den zweiten Ansichts-Controller den Klassennamen auf
SecondViewController
und die Storyboard-ID aufsecondVC
.Code
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) } }
Quelle:
quelle
Der einfachste Weg, den ich in xcode 4.52 müde war, bestand darin, eine zusätzliche Ansicht zu erstellen und sie mit segue modal zu verbinden (Steuerung ziehen Sie die Schaltfläche von Ansicht eins in die zweite Ansicht, wählen Sie Modal). Ziehen Sie dann eine Schaltfläche in die zweite Ansicht oder die von Ihnen erstellte modale Ansicht. Steuern und ziehen Sie diese Schaltfläche in die Header-Datei und verwenden Sie die Aktionsverbindung. Dadurch wird eine IBaction in Ihrer controller.m-Datei erstellt. Finden Sie Ihren Schaltflächenaktionstyp im Code.
[self dismissViewControllerAnimated:YES completion:nil];
quelle
self.presentingViewController
(nach der UIViewController Dokumentation) so für Klarheit ist es besser, rufen Sie an[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
presentModalViewController:
MainViewController *mainViewController=[[MainViewController alloc]init]; [self.navigationController presentModalViewController:mainViewController animated:YES];
entlassenModalViewController:
[self dismissModalViewControllerAnimated:YES];
quelle
Der einfachste Weg, dies zu tun, ist die Verwendung von Storyboard und einem Segue.
Erstellen Sie einfach einen Segue vom FirstViewController (nicht vom Navigationscontroller) Ihres TabBarControllers zu einem LoginViewController mit der Login-Benutzeroberfläche und nennen Sie ihn "showLogin".
Erstellen Sie eine Methode, die ein BOOL zurückgibt, um zu überprüfen, ob der angemeldete Benutzer und / oder seine Sitzung gültig ist ... vorzugsweise im AppDelegate. Nennen Sie es isSessionValid.
Überschreiben Sie auf Ihrem FirstViewController.m die Methode viewDidAppear wie folgt:
- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if([self isSessionValid]==NO){ [self performSegueWithIdentifier:@"showLogin" sender:self]; } }
Wenn sich der Benutzer erfolgreich angemeldet hat, schließen Sie einfach den LoginViewController oder öffnen Sie ihn, um Ihre Registerkarten anzuzeigen.
Funktioniert 100%!
Ich hoffe es hilft!
quelle
Schnell
self.dismissViewControllerAnimated(true, completion: nil)
quelle