2014-10-29 15 views
7

Dies ist meine Ansicht (Controller) Hierarchie:Dismissing modal-View-Controller führt zu einem schwarzen Bildschirm

  • UITabBarController (als rootViewController der app)
  • UINavigationController (als viewController für eine der tabBar tabs)
  • UIViewController (wie die rootViewController der UINavigationController)
  • UICollectionView (als subview)
  • 0.123.
  • MyViewController.view (als Sektionskopf Ansicht der UICollectionView)

Und so, ich brauche einen modalen View-Controller von MyViewController zu präsentieren. Ich habe versucht, es zu tun mit

[self presentViewController:modalVC animated:YES completion:nil]; 

und obwohl es funktionierte, Xcode hatte mich gewarnt, dass „Presenting Ansicht-Controller auf getrennte Ansicht Controller wird abgeraten“, und das zu Recht, denn die modalVC nur die Ansicht des Kopfes Sammlung Ansicht füllen , das ist kein Vollbild, nach dem ich suche.

Alle anderen Optionen, die ich versucht habe:

UITabBarController *tb = (UITabBarController *)self.view.window.rootViewController; 
[tb presentViewController:modalVC animated:YES completion:nil]; 

or... 

UINavigationController *nc = (UINavigationController *)tb.selectedViewController; 
[tb presentViewController:modalVC animated:YES completion:nil]; 

or... 

UICustomViewController *cv = (UICustomViewController *)nc.topViewController; 
[vc presentViewController:modalVC animated:YES completion:nil]; 

die modalVC Vollbild darzustellen, wie gewünscht, aber wenn ich die modalVC entlassen durch

[self dismissViewControllerAnimated:YES completion:nil]; 

aus modalVC Aufruf selbst, modalVC in der Tat entlässt sich selbst, aber ich bin mit einem schwarzen Bildschirm verlassen. Ein kleines Debugging ergab, dass self.view.window.rootViewControllernil wird, nachdem ModalVC beendet wurde.

Irgendeine Idee, warum dies geschieht und wie man das löst?

EDIT

Dies ist ein iPhone-App. Der schwarze Bildschirm passiert sowohl auf iOS7 als auch auf iOS8. Auch unten ist die Methode, wo ich MyViewController

#pragma mark - UICollectionViewDelegate methods 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { 

    self.myViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 

    return self.myViewController.view.frame.size; 
} 
+0

Können Sie Ihr Setup von 'MyViewController' und' MyViewController.view' anzeigen? –

+0

Aaron, ich habe die Frage aktualisiert. Haben Sie danach gefragt? Ich mache keine zusätzlichen Setups in 'MyViewController' selbst. – artooras

Antwort

6

Ich fand die Lösung - this answer wirklich geholfen. Der Trick bestand darin, den View-Controller zu verwerfen.

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 

und nicht so::

[self dismissViewControllerAnimated:YES completion:nil]; 

Obwohl der Autor der verlinkten Antwort legt nahe, dass ein besserer Ansatz Delegation wäre zu verwenden (presented VC würde ein Protokoll definiert Es sollte so erfolgen und präsentieren würde VC würde abonnieren und dann die presented VC entlassen, sobald es darum bittet), war es in meinem Fall nicht machbar.

1

Ist dies ein iPad-App initiieren? Wenn ja, das Hinzufügen

modalVC.modalPresentationStyle = UIModalPresentationFullScreen 

vor

[self presentViewController:modalVC animated:YES completion:nil]; 

in MyViewController könnte den Trick tun.

+0

Klaus, es ist eine iPhone App - Ich werde die Frage aktualisieren – artooras

+1

Hey, diese Antwort hat mich zumindest in die richtige Richtung gelenkt: Ich habe ein Storyboard-Segment auf _Present Modally_ gesetzt und _Current Context_ aus dem Dropdown-Menü Präsentation im Attribute-Inspektor ausgewählt der Übergang, löste das Problem in meinem Fall. Vielen Dank! –

0

ich einige Informationen in Apples UIViewController

// für PresentModalViewController Die nächsten beiden Methoden sind Ersatz-Datei finden: animiert und // dismissModalViewControllerAnimated: Der Abschluss-Handler, wenn vorhanden, wird nach den vorgestellten Controller aufgerufen werden viewDidAppear: Callback wird aufgerufen.

  • (void) presentViewController: (UIViewController *) viewControllerToPresent animiertes: (BOOL) flag Vollendung: (void (^) (void)) Fertigstellung NS_AVAILABLE_IOS (5_0); // Der Beendigungshandler, falls vorhanden, wird nach dem ViewDidDisappear des entlassenen Controllers aufgerufen: Callback wird aufgerufen.
  • (void) ablehnenViewControllerAnimated: (BOOL) Flag-Vervollständigung: (void (^) (void)) Vervollständigung NS_AVAILABLE_IOS (5_0);

Wie Sie describled Sie direkt Blick in UIViewController zu einer anderen Ansicht hinzuzufügen. Daher werden viewDidAppear und viewDidDisappear nicht aufgerufen. Ich denke, Sie sollten diese beiden Methoden lieber manuell ausführen.

Verwandte Themen