webentwicklung-frage-antwort-db.com.de

Wie kann man 2 Modal View Controller nacheinander schließen?

Ich habe 2 View Controller modal dargestellt.

A presents B which presents C.

Wenn ich C entlasse, möchte ich auch B entlassen. Aber ich bin mir nicht sicher, wie ich das machen soll:

C entlassen:

[self dismissModalViewControllerAnimated:YES]
//[delegate dismissB] //this doesn't work either when i create a delegate pattern

Jetzt bin ich bei B geblieben. Wie kann ich B von C entfernen?

34
Sheehan Alam

Versuchen Sie es mit dem nächsten Code in B (direkt nach dem Ablegen von C, wie Sie es bereits getan haben):

[self.parentViewController dismissModalViewControllerAnimated:YES];

WICHTIG:
Tun Sie nichts in der Methode nach dieser Zeile.
Dieser View-Controller (B) wird wahrscheinlich freigegeben und freigegeben ...

AKTUALISIEREN:
Ab iOS7 ist die obige Methode veraltet.
Verwenden Sie stattdessen die nächste Methode:

[self.parentViewController dismissViewControllerAnimated:YES completion:^{ /* do something when the animation is completed */ }];
9
Michael Kessler

Ich habe gerade herausgefunden, dass Sie PresentationViewController in iOS 5 verwenden müssen.

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

A -> B -> C

Wenn Sie den obigen Code in modalem C ausführen, gelangen Sie wieder zu A

106
Andy Davies

Das hat für mich sehr einfach funktioniert

// Call inside View controller C    
self.presentingViewController?.dismissViewControllerAnimated(false, completion: nil)
self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

Erläuterung: 

Wenn Sie auf C Abbruch aufrufen, kann es nur C entfernen. Wenn Sie Abbruch auf B aufheben, werden Sie das Richtige tun: Entfernen Sie den obersten modalen Ansichtscontroller. Der erste Aufruf entfernt daher C (ohne Animation). Der zweite Anruf entfernt B. 

Der einfachste Weg zum Zugriff auf den Ansichts-Controller B von C aus ist die Verwendung der Variablen presentViewController. 

14
n13

In B. Put:

[self dismissModalViewControllerAnimated:NO];
[self dismissModalViewControllerAnimated:YES];

Führen Sie nur eine Animation aus. 

12

Überprüfen Sie dies für Swift:

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil);
5
Victor Rius

In Swift 4

self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil); 

3
TheSwiftGuy77

Ich habe alle Themen gelesen und keine richtige Antwort gefunden. Wenn Sie B abweisen, verschwindet C sofort und erzeugt einen seltsamen Effekt. Der richtige Weg ist, C als untergeordneten Ansichts-Controller mit benutzerdefinierten Animationen von unten darzustellen, z.

   [b addChildViewController:c];
    c.view.frame = CGRectOffset(b.view.bounds, 0, b.view.bounds.size.height);
    [b.view addSubview:c.view];
    [c didMoveToParentViewController:b];

    [UIView animateWithDuration:0.5 animations:^{
        c.view.frame = CGRectOffset(c.view.frame, 0, -b.view.bounds.size.height);
    } completion:^(BOOL finished) {

    }];

Und dann lässt du einfach B los und es sieht alles viel schöner aus!

2
Rudolf J

Sie benötigen nur einen Abweisungsbefehl. Sie müssen nur B entlassen, und C wird damit fortfahren. 

2
Dancreek

Das hat für mich funktioniert:

// Swift
presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

// Objective-C
[self.presentingViewController dismissViewControllerAnimated:true completion:nil];
2
Nagra

Inspiriert von der Lösung von Albertos habe ich in B eine Delegat-Methode mit einem Block erstellt, um ein Ergebnis des Löschens eines Kontos anzuzeigen: 

#pragma - mark - AddAccountViewControllerDelegate Methods

- (void) dismissToSettings {
    [self dismissModalViewControllerAnimated:NO];
    [self dismissViewControllerAnimated:YES completion:^(void){[DKMessage showMessage:LS(@"Account was successfully created")];}];
}
0
wzbozon

So können Sie mehr als einen Modal-View-Controller mit einem Wiederholungszyklus verwerfen:

Swift 3

// In this example code will go throw all presenting view controllers and 
// when finds it then dismisses all modals.
var splitViewController: UIViewController? = self

repeat {
    splitViewController = splitViewController?.presentingViewController
} while (!(splitViewController is UISplitViewController) && (splitViewController != nil))

splitViewController?.dismiss(animated: true, completion: nil)
0
Ramis

Ich weiß, dass sich diese Antwort als überflüssig anfühlt, aber die folgende Aussage sollte sinnvoll sein und Sie erhalten eine Vorstellung davon, wie dies funktioniert.

Schließen Sie einfach den ältesten Ansichtscontroller und alle anderen späteren Ansichtscontroller verschwinden damit.

Bei 2 View Controllern:

Ziel c:

[self.presentingViewController dismissViewControllerAnimated:true completion:nil]

Schnell:

presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
0
Shobhit C

Ich hatte das gleiche Problem und eine bessere Lösung war das Erstellen eines "DismissViewProtocol" wie folgt:

Datei: DismissViewProtocol.h

@protocol DismissViewProtocol <NSObject>
-(void)dismissView:(id)sender;
@end

Lassen Sie uns in meiner B-Modalansicht auf die Delegatmethode antworten:

in meiner b.h-Datei:

#import "DismissViewProtocol.h"
@interface B-Modal : UIViewController <DismissViewProtocol>
...
@end

in meiner b.m-Datei:

-(void) dismissView:(id)sender
{
 [((UIViewController *) sender) dismissModalViewControllerAnimated:NO];
 [self dismissModalViewControllerAnimated:YES];
}

Wenn ich in derselben B-View-Steuerung die Anrufe, dann in meiner B-Modalansicht, wenn ich die andere Modalansicht C anrufe, unter der Annahme, dass für segue

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    ((C-ViewController *)segue.destinationViewController).viewDelegate=self;
}

Lassen Sie uns in meiner c.h-Datei den Delegierten vorbereiten:

@property(nonatomic, weak) id <DismissViewProtocol> viewDelegate;

Und in meiner c.m-Datei sage ich meinem viewDelegate einfach, meinen modalen View-Controller und sich selbst zu schließen:

-(void)closeBothViewControls
{
       [self.viewDelegate dismissView:self];
}

Und das ist es.

Ich hoffe es funktioniert für euch alle.

0
Anibal Itriago

Ich habe eine Lösung gefunden.

Sie können diese ViewControllers in eine einzelne NavigationController einfügen. Und dann wird das NavigationController alle diese ViewControllers auf einmal entlassen.

https://Gist.github.com/ufo22940268/2949fdf59c9860292f263ebb1e8036d7

0
Frank Cheng

Der Navigationscontroller hat eine "viewControllers" -Eigenschaft, bei der es sich um ein Array handelt. Sie können ein neues Array festlegen, abzüglich der beiden View-Controller, die Sie entfernen möchten.