2015-06-22 15 views
11

मैं SpriteKit का उपयोग कर एक गेम बना रहा हूं। मेरे पास 3 व्यू कंट्रोलर हैं: लेवल वीसी, गेम वीसी, और वीसीसी जीतना। खेल खत्म हो जाने के बाद, मैं जीत वीसी दिखाना चाहता हूं, फिर अगर मैं जीत वीसी पर ओके बटन दबाता हूं, तो मैं जीत वीसी और गेम वीसी (स्टैक से पॉप दो व्यू कंट्रोलर) को खारिज करना चाहता हूं। लेकिन मैं इसे कैसे करना है क्योंकि अगर मैंएक से अधिक दृश्य नियंत्रक को एक साथ खारिज करें

self.dismissViewControllerAnimated(true, completion: {})  

जीत कुलपति (ढेर के ऊपर) को खारिज कर दिया है फोन पता नहीं है, इसलिए मैं नहीं जानता कि जहां इसे फिर से खेल कुलपति को बर्खास्त करने कॉल करने के लिए। क्या नेविगेशन नियंत्रक का उपयोग किये बिना मैं इसे ठीक कर सकता हूं?

यह 1 कुलपति है: (कृपया के साथ शुरू नीचे मेरी टिप्पणी पर ध्यान देना "//")

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

यह 2 कुलपति है:

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() {...} 
} 

और यह 3 है कुलपति:

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

अधिक सामान्य खारिज करने के लिए अधिक है कि एक मॉडल दृश्य नियंत्रक [यहां] है जिस तरह से (https://stackoverflow.com/a/44583711/1151916) – Ramis

उत्तर

4

आप कॉल करने के लिए सक्षम होना चाहिए:

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

(आप कहीं ? या ! जोड़ना पड़ सकता है - मैं एक तेज डेवलपर नहीं कर रहा हूँ)

+4

कैसे इसे एक से अधिक दृश्य नियंत्रकों को खारिज करता है? – Gruntcakes

+2

यह काम किया! मैं कहा: self.dismissViewControllerAnimated (सच है, पूरा होने: {}) self.presentingViewController .dismissViewControllerAnimated (सच है, पूरा होने: {})? – minsanity

+0

मैं srsly downvotes समझ में नहीं आता। यह वास्तव में करेगा जो ओपी पूछता है। –

22

आप पूरा होने के ब्लॉक में WinVC के पेश नियंत्रक (GameViewController) को खारिज कर सकते हैं:

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

वैकल्पिक रूप से , आप रूट व्यू कंट्रोलर तक पहुंच सकते हैं और कॉलमव्यू कंट्रोलर एनीमेटेड कॉल कर सकते हैं, जो एक एकल एनीमेशन में मोडल व्यू कंट्रोलर दोनों को खारिज कर देगा:

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

काम नहीं किया ... यह केवल स्टैक – minsanity

+0

के शीर्ष पर वीसी को खारिज कर देता है अब अपने प्रश्न को फिर से पढ़ना, यह स्पष्ट नहीं है कि क्या आपके व्यू कंट्रोलर (गेमवैक और विनवैक) को मॉड्यूलिक रूप से प्रस्तुत किया जाता है या धक्का दिया जाता है। क्या आप नेविगेशन नियंत्रक का उपयोग कर रहे हैं? –

+0

कारण यह काम नहीं कर रहा है क्योंकि self.presentingViewController को पूरा करने में शून्य है –

2

विशेष कुछ दृश्य दृश्य नियंत्रक को बैक व्यू स्टैक रोल करने के उद्देश्य से को अलग करना है। कृपया मेरा उत्तर यहां देखें: how to dismiss 2 view controller in swift ios?

25

@ केन तोह की टिप्पणी इस स्थिति में मेरे लिए क्या काम करती थी - दृश्य नियंत्रक से कॉल को खारिज करें जिसे आप सबकुछ खारिज कर दिए जाने के बाद दिखाना चाहते हैं।

आप एक 3 प्रस्तुत दृश्य A, B और C नियंत्रकों, जहां C शीर्ष पर है की "ढेर" है, तो बुला A.dismiss(animated: true, completion: nil) बी और सी एक साथ खारिज करेगा।

यदि आपके पास स्टैक की जड़ का संदर्भ नहीं है, तो आप इसे प्राप्त करने के लिए presentingViewController पर कुछ एक्सेसों को चेन कर सकते हैं। कुछ इस तरह:

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

पूरी तरह से काम करता है –

+1

यह सही उत्तर होना चाहिए – user2995344

संबंधित मुद्दे

 संबंधित मुद्दे