web-dev-qa-db-fra.com

Rejeter et présenter le contrôleur de vue dans Swift

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

11
Ron Pelayo

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)
}
16
Sandeep Kumar

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:


8
DariusV

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

6
HDT
let parent = self.parentViewController!

parent.dismissViewControllerAnimated(true, completion: {
            let vc = self.storyboard?.instantiateViewControllerWithIdentifier("OrderViewController")
            parent.presentViewController(vc!, animated: true, completion: nil)
        })
3
Code

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)
1
pansora abhay
if let vc = storyboard?.instantiateViewController(withIdentifier: "IdOfYourVC") {

    present(vc, animated: true, completion: nil)
}
0
Andrey