Kann mir jemand den Beispielcode geben, mit dem ich einen modalen Ansichtscontroller zuerst 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);
Erstens, wenn Sie diesen Code in applicationDidFinishLaunching einfügen, ist es möglich, dass Controller, die über Interface Builder instanziiert wurden, noch nicht mit Ihrer Anwendung verknüpft sind ("red" und "blue" sind also immer noch nil
).
Aber um Ihre erste Frage zu beantworten, machen Sie falsch, dass Sie dismissModalViewControllerAnimated:
Auf dem falschen Controller aufrufen! Es sollte so sein:
[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];
Normalerweise sollte sich der "rote" Controller irgendwann selbst entlassen (möglicherweise, wenn auf die Schaltfläche "Abbrechen" geklickt wird). Dann könnte der "rote" Controller die Methode auf self
aufrufen:
[self dismissModalViewControllerAnimated:YES];
Wenn dies immer noch nicht funktioniert, hat dies möglicherweise damit zu tun, dass der Controller in Form einer Animation dargestellt wird. Daher können Sie den Controller möglicherweise nicht so bald nach seiner Darstellung schließen.
Aktualisiert für Swift 3
Erstellen Sie zwei View Controller mit jeweils einer Schaltfläche. Setzen Sie für den zweiten Ansichtscontroller den Klassennamen auf SecondViewController
und die Storyboard-ID auf secondVC
.
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:
Die einfachste Möglichkeit, mit xcode 4.52 fertig zu werden, bestand darin, eine zusätzliche Ansicht zu erstellen und diese mithilfe des Segue-Modals zu verbinden (ziehen Sie die Schaltfläche von Ansicht 1 in die zweite Ansicht, und wählen Sie Modal aus). Ziehen Sie dann eine Schaltfläche in die zweite Ansicht oder in 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 Button Aktionstyp im Code.
[self dismissViewControllerAnimated:YES completion:nil];
presentModalViewController:
MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];
dismissModalViewController:
[self dismissModalViewControllerAnimated:YES];
Swift
self.dismissViewControllerAnimated(true, completion: nil)
Am einfachsten geht das mit Storyboard und Segue.
Erstellen Sie einfach einen Segue vom FirstViewController (nicht dem Navigationscontroller) Ihres TabBarControllers zu einem LoginViewController mit der Login-Benutzeroberfläche und nennen Sie ihn "showLogin".
Erstellen Sie eine Methode, die eine BOOL zurückgibt, um zu überprüfen, ob der angemeldete Benutzer und/oder seine Sitzung gültig sind ... 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 zu 100%!
Ich hoffe es hilft!