Bonjour, j'essaie de présenter un contrôleur de vue et de rejeter ma vue modale actuelle, mais ce code ne fonctionne pas.
self.dismissViewControllerAnimated(true, completion: {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
self.presentViewController(vc!, animated: true, completion: nil)
})
l'inverse ne fonctionne pas trop sur le bloc d'achèvement de presentviewcontroller
EDIT: remplacé vc! à soi
Vous devez obtenir le viewController qui s'est présenté (ViewController actuel). Si ce contrôleur de vue est rootViewController que vous pouvez utiliser comme ci-dessous, sinon, interrogez-le en fonction de la hiérarchie du contrôleur de vue.
if let vc3 = self.storyboard?.instantiateViewControllerWithIdentifier("vc3") as? ViewController3 {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.window?.rootViewController!.presentViewController(vc3, animated: true, completion: nil)
}
vous ne pouvez pas le faire car, lorsque UIViewController A appelle UIViewController B et que le premier contrôleur est congédié, les deux contrôleurs sont nuls.
Vous devez avoir un UIViewController comme base, dans ce cas MainViewController est la base. Vous devez utiliser un protocole pour appeler la navigation entre les contrôleurs.
vous pouvez faire en utilisant le protocole disons par exemple comme ci-dessous: -
Dans votre protocole de configuration viewController:
protocol FirstViewControllerProtocol {
func dismissViewController()
}
class FirstViewController: UIViewController {
var delegate:FirstViewControllerProtocol!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func goBack(sender: AnyObject) {
self.dismissViewControllerAnimated(true) {
self.delegate!.dismissViewController()
}
}
Maintenant dans votre contrôleur de vue principale
class MainViewController: UIViewController, FirstViewControllerProtocol {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func goToFirstViewController(sender: AnyObject) {
let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(FirstViewController)) as! FirstViewController
viewController.delegate = self
self.presentViewController(viewController, animated: true, completion: nil)
}
//MARK: Protocol
func dismissViewController() {
if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier(String(SecondViewController)){
self.presentViewController(viewController, animated: true, completion: nil)
}
}
Exemple de code avec storyboard:
Je pense qu'il y a une erreur dans votre code où "self" doit être le contrôleur de présentation qui présente "vc", pas "vc" lui-même.
Votre code
self.dismissViewControllerAnimated(true, completion: {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
vc!.presentViewController(vc!, animated: true, completion: nil)
})
Essaye ça
self.dismissViewControllerAnimated(true, completion: {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
self.presentViewController(vc!, animated: true, completion: nil)
})
espérons que cela vous sera utile
let parent = self.parentViewController!
parent.dismissViewControllerAnimated(true, completion: {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
parent.presentViewController(vc!, animated: true, completion: nil)
})
Voici une solution pour Swift3
Présenter le ViewController
let NotificationVC = self.storyboard?.instantiateViewController(withIdentifier: "NotificationVC") as! ExecutiveNotificationViewController
self.present(NotificationVC, animated: true, completion: nil)
Pour rejeter le ViewController:
self.dismiss(animated: true, completion: nil)
if let vc = storyboard?.instantiateViewController(withIdentifier: "IdOfYourVC") {
present(vc, animated: true, completion: nil)
}