2015-06-22 11 views
11

Ich mache ein Spiel mit SpriteKit. Ich habe 3 ViewControllers: Auswahl der Ebene VC, Spiel vc und Win VC. Nachdem das Spiel vorbei ist, möchte ich die win vc zeigen, dann, wenn ich OK auf der win vc, möchte ich die win vc und das Spiel vc (Pop zwei View-Controller aus dem Stapel) entlassen. Aber ich weiß nicht, wie es zu tun, weil, wenn ich rufeSchließen Sie mehr als einen View-Controller gleichzeitig

self.dismissViewControllerAnimated(true, completion: {})  

der Sieg vc (oben auf dem Stapel) wird vom Platz gestellt, so dass ich weiß nicht, wo es zu nennen das Spiel erneut vc zu entlassen. Gibt es eine Möglichkeit, das ohne Navigationscontroller zu beheben?

Dies ist der erste VC: (Bitte achten Sie auf meine Kommentare mit folgendem Ausgang "//")

class SelectLevelViewController: UIViewController { // I implemented a UIButton on its storyboard, and its segue shows GameViewController 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
} 

Dies ist der zweite VC:

class GameViewController: UIViewController, UIPopoverPresentationControllerDelegate { 
    var scene: GameScene! 
    var stage: Stage! 

    var startTime = NSTimeInterval() 
    var timer = NSTimer() 
    var seconds: Double = 0 
    var timeStopped = false 

    var score = 0 

    @IBOutlet weak var targetLabel: UILabel! 
    @IBOutlet var displayTimeLabel: UILabel! 
    @IBOutlet weak var scoreLabel: UILabel! 
    @IBOutlet weak var gameOverPanel: UIImageView! 
    @IBOutlet weak var shuffleButton: UIButton! 
    @IBOutlet weak var msNum: UILabel! 

    var mapNum = Int() 
    var stageNum = Int() 

    var tapGestureRecognizer: UITapGestureRecognizer! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let skView = view as! SKView 
     skView.multipleTouchEnabled = false 

     scene = GameScene(size: skView.bounds.size) 
     scene.scaleMode = .AspectFill 
     msNum.text = "\(mapNum) - \(stageNum)" 

     stage = Stage(filename: "Map_0_Stage_1") 
     scene.stage = stage 
     scene.addTiles() 
     scene.swipeHandler = handleSwipe 

     gameOverPanel.hidden = true 
     shuffleButton.hidden = true 

     skView.presentScene(scene) 

     Sound.backgroundMusic.play() 

     beginGame() 
    } 

    func beginGame() { 
     displayTimeLabel.text = String(format: "%ld", stage.maximumTime) 
     score = 0 
     updateLabels() 

     stage.resetComboMultiplier() 

     scene.animateBeginGame() { 
      self.shuffleButton.hidden = false 
     } 

     shuffle() 

     startTiming() 
    } 

    func showWin() { 
     gameOverPanel.hidden = false 
     scene.userInteractionEnabled = false 
     shuffleButton.hidden = true 

     scene.animateGameOver() { 
      self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "hideWin") 
      self.view.addGestureRecognizer(self.tapGestureRecognizer) 
     } 
    } 

    func hideWin() { 
     view.removeGestureRecognizer(tapGestureRecognizer) 
     tapGestureRecognizer = nil 

     gameOverPanel.hidden = true 
     scene.userInteractionEnabled = true 

     self.performSegueWithIdentifier("win", sender: self) // this segue shows WinVC but idk where to dismiss this GameVC after WinVC gets dismissed... 
    } 

    func shuffle() {...} 
    func startTiming() {...} 
} 

Und dies ist die dritte VC:

class WinVC: UIViewController { 

    @IBOutlet weak var awardResult: UILabel! 

    @IBAction func dismissVC(sender: UIButton) { 
     self.dismissViewControllerAnimated(true, completion: {}) // dismissing WinVC here when this button is clicked 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

} 
+0

Weitere generische Art und Weise mehr als eine modale View-Controller ist zu entlassen [hier] (https://stackoverflow.com/a/44583711/1151916) – Ramis

Antwort

4

Sie sollten in der Lage sein zu nennen:

self.presentingViewController.dismissViewControllerAnimated(true, completion: {}); 

(Möglicherweise müssen Sie ? oder ! irgendwo hinzufügen - ich bin nicht eine schnelle Entwicklung)

+4

Wie funktioniert diese mehrere View-Controller entlassen? – Gruntcakes

+2

Es hat funktioniert! Ich fügte hinzu: self.dismissViewControllerAnimated (true, Fertigstellung: {}) self.presentingViewController .dismissViewControllerAnimated (true, Fertigstellung: {})? – minsanity

+0

ich srsly nicht verstehen, die downvotes. Dies wird tatsächlich tun, was das OP fragt. –

22

Sie können WinVC der Präsentation Controller (GameViewController) im Abschluss Block entlassen:

let presentingViewController = self.presentingViewController 
self.dismissViewControllerAnimated(false, completion: { 
    presentingViewController!.dismissViewControllerAnimated(true, completion: {}) 
}) 

Alternativ , können Sie den root-View-Controller erreichen und disallViewControllerAnimated aufrufen, wodurch beide modalen viewcontrollers in einer Animation gelöscht werden:

self.presentingViewController!.presentingViewController!.dismissViewControllerAnimated(true, completion: {}) 
+3

Hat nicht funktioniert ... es nur die VC auf der Spitze des Stapels entlässt – minsanity

+0

Jetzt lesen Sie Ihre Frage noch einmal, es ist nicht klar, ob Ihre Viewcontroller (Gamevc ​​und Winvc) modal präsentiert oder geschoben werden. Verwenden Sie einen Navigationscontroller? –

+0

Der Grund, warum es nicht funktioniert, ist, weil selb.presentingViewController in der Fertigstellung –

25

@Ken Toh's Kommentar war, was für mich in dieser Situation funktionierte - Call ablehnen von der View-Controller, die Sie zeigen möchten, nachdem alles andere entlassen wird.

Wenn Sie einen „Stapel“ von 3 dargestellt View-Controller haben A, B und C, wo C oben ist, dann A.dismiss(animated: true, completion: nil) Aufruf wird gleichzeitig B und C entlassen.

Wenn Sie keinen Verweis auf den Stamm des Stapels haben, könnten Sie ein paar Zugriffe auf presentingViewController ketten, um dorthin zu gelangen. Etwas wie folgt aus:

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

funktioniert perfekt –

+1

sollte dies die richtige Antwort sein – user2995344

Verwandte Themen