wake-up-neo.com

Mehrere modale Ansichtssteuerungen präsentieren?

Update:
Ich bin wieder mit diesem Problem konfrontiert und habe einen anderen Weg gefunden. Wenn der präsentierende Controller nicht in den Navigationscontroller eingebettet ist, wird er ausgeblendet, wenn der präsentierte Controller nicht im Vollbildmodus ist und schwarz wird. Methode setModalPresentationStyle: UIModalPresentationCurrentContext kann nur auf den Navigationscontroller angewendet werden. Betten Sie also den präsentierenden Controller in UINavigationController ein, setzen Sie UIModalPresentationCurrentContext und präsentieren Sie einen neuen Controller - Sie erhalten einen Dialog-Controller.

Ich präsentiere Suchcontroller, es hat tableView, dass Push-On-Stack detaillierte Controller.

Ein detaillierter Controller kann dem View Controller eine Nachricht anzeigen. Er besteht aus einem kleinen UIView und einem halbtransparenten Hintergrund.

Problem: Wenn der letzte View-Controller angezeigt wird, werden alle darunter befindlichen View-Controller ausgeblendet, und der Controller, der angezeigt wird, wird angezeigt.

Hier mache ich was:

SearchViewController *viewController = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil];
viewController.data = dataArray;

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
[self.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];
[self.navigationController presentViewController:navigationController animated:YES completion:nil];

als Tabelle schiebt Detailansicht:

DetailViewController *viewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[viewController setHidesBottomBarWhenPushed:YES];
viewController.dataItem = [data objectAtIndex:(NSUInteger) [indexPath row]];
[self.navigationController pushViewController:viewController animated:YES];

und Detailansicht des Meldungsfelds:

MessageController *controller = [[MessageController alloc] initWithNibName:@"MessageController" bundle:nil];
controller.message = message;
[self presentViewController:controller animated:YES completion:nil];

Wenn es abgewiesen wurde, wurden alle Controller darunter sichtbar.

Update:

alles, was ich wollte, ist, modal einen View-Controller zu präsentieren, der uitableview hat. Aus dieser Tabelle wird eine Detailansicht angezeigt, in der das Meldungsfeld angezeigt werden kann. Meldungsfeld muss ein anderer Ansichtscontroller sein. Wenn ein Meldungsfeld angezeigt wird, werden alle zwei vorhergehenden Steuerungen ausgeblendet. das ist das Problem.

13
trickster77777

Der triviale Weg, dies zu erreichen, ist das Erstellen der VCs Sie möchten modal präsentieren und nacheinander präsentieren . Leider funktioniert das nicht. Was Sie bekommen, ist nur der erste VC vorgestellt, alle anderen gehen einfach nirgendwo hin. UIKit kooperiert einfach nicht mit dir hier.

http://xissburg.com/presenting-multiple-modal-view-controllers-at-once/

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
4
Gtx

Deaktivieren Sie alle Ansichtscontroller oberhalb des angezeigten Viewcontrollers.

Apples Dokumentation folgt:

Wenn Sie mehrere View-Controller nacheinander präsentieren und somit einen Stapel dargestellter View-Controller erstellen, werden beim Aufruf dieser Methode auf einem View-Controller unterhalb des Stacks der unmittelbar untergeordnete View-Controller und alle View-Controller, die über diesem Kind liegen, im Stack verworfen. In diesem Fall wird nur die oberste Ansicht auf animierte Weise verworfen. Alle Zwischen-View-Controller werden einfach vom Stapel entfernt. Die oberste Ansicht wird mit ihrem modalen Übergangsstil verworfen, der sich von den Stilen unterscheiden kann, die von anderen Ansichtscontrollern verwendet werden, die sich im Stapel befinden.

Schließen Sie zwei Modal-View-Controller ab.

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

https://developer.Apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#jumpTo_51

10
Rei Kubonaga

In einigen Situationen können Sie jeden modal dargestellten View-Controller den nächsten anzeigen lassen.

let window = UIApplication.sharedApplication().keyWindow!
if let modalVC = window.rootViewController?.presentedViewController {
    modalVC.presentViewController(vc, animated: true, completion: nil)
} else {
    window.rootViewController!.presentViewController(vc, animated: true, completion: nil)
}
9
SlimeBaron

Diese Antwort mag etwas unkonventionell erscheinen, funktioniert aber. Sie können damit "mehrere Modale öffnen", aber nur jeweils eine anzeigen. Der Schlüssel besteht darin, nur einen Modalmodus zu haben. Verwenden Sie jedoch einen Tab Bar Controller, um zwischen View Controller s zu wechseln.

 multiple modals

  1. Verbinden Sie Ihr modales Segment vom blauen (präsentierenden) View Controller mit einem modalen Container (der nur ein normaler View Controller ist).
  2. Der modale Container enthält nur eine Container-Ansicht, deren einziger Zweck das Einbetten eines Tab Bar Controller ist.
  3. Betten Sie einen Tab Bar Controller in die Containeransicht ein
  4. Jede Registerkarte kann ein separater View Controller sein, der "mehrere Modale" darstellt.
  5. Setzen Sie den Tab Bar Controller für Tab Bar auf hidden.
  6. Mit tabBarController?.selectedIndex = 1 zwischen Modalen wechseln
  7. Schließen Sie den Modal normalerweise mit dismissViewControllerAnimated(true, completion: nil) 

Es würde ungefähr so ​​aussehen:

 enter image description here

8
Robert Chen

Stellen Sie die richtige modalPresentationStyle auf beide die navigationController UND die viewController selbst ein.

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
vcToPresent.modalPresentationStyle = UIModalPresentationFormSheet;
vcToPresent.preferredContentSize = CGSizeMake(650, 450);

[self presentViewController:vcToPresent animated:YES completion:^{
    self.navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}];`
1
rizzes

Ich habe eine Lösung gefunden: Stellen Sie Ihre eigene Animation bereit:

    let transition: CATransition = CATransition()
    transition.duration = 0.5
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.type = kCATransitionReveal
    transition.subtype = kCATransitionFromBottom
    self.view.window!.layer.add(transition, forKey: nil)
    self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)
0
Antzi