Entlässt mehr als ein view-controller gleichzeitig
Mache ich ein Spiel mit SpriteKit.
Ich habe 3 viewControllers: Auswahl der Ebene vc-Spiel vc, und gewinnen Sie vc.
Nachdem das Spiel vorbei ist, möchte ich zeigen, die gewinnen, vc, danach, wenn ich drücken Sie die Taste OK auf der win-vc, ich möchte zu entlassen, der Gewinn-vc UND das Spiel vc (pop zwei view-Controllern aus dem stack). Aber ich weiß nicht, wie es zu tun, weil wenn ich Anruf
self.dismissViewControllerAnimated(true, completion: {})
den Sieg vc (top of stack) wird abgewiesen, so dass ich nicht weiß, wo man es nennen, wieder zu entlassen, das Spiel vc.
Gibt es eine Möglichkeit, ich kann dieses Problem beheben, ohne mit der navigation-controller?
Dies ist der 1. VC: (Bitte achten Sie auf meine Kommentare unten, beginnend mit "//")
class SelectLevelViewController: UIViewController { //I implemented a UIButton on its storyboard, and its segue shows GameViewController
override func viewDidLoad() {
super.viewDidLoad()
}
}
Dies ist die 2. 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 das 3. 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()
}
}
InformationsquelleAutor minsanity | 2015-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Ken Toh ' s Kommentar war was für mich gearbeitet in dieser situation-nennen wir entlassen aus der view-controller, die Sie anzeigen möchten, nachdem alles andere wird abgewiesen.
Wenn Sie einen "stack" von 3 vorgestellt view-Controller
A
,B
undC
, woC
ist an der Spitze, dann ruftA.dismiss(animated: true, completion: nil)
entlassen, B und C gleichzeitig.Wenn Sie nicht über einen Verweis auf die Wurzel des Stapels, Sie könnten die Kette ein paar Zugriffe auf
presentingViewController
um Sie zu bekommen. So etwas wie dieses:dies sollte die richtige Antwort
Jeder Weg, dies zu tun, ohne die intermediate-view-controller "B" zeigt kurzzeitig während des übergangs?
wow, funktioniert perfekt. Tolle Arbeit
controller B noch zeigen, für einen Bruchteil einer Sekunde beim übergang zu A. gibt es Abhilfe zu diesem problem?
InformationsquelleAutor
Kann man getrost WinVC die Präsentation controller (GameViewController) in den Abschluss-block:
Alternativ könnten Sie erreichen, um die root-view-controller und rufen Sie dismissViewControllerAnimated, die entlassen, die beiden modalen viewcontrollers in eine einzelne animation:
Jetzt Lesen Sie Ihre Frage noch einmal, es ist nicht klar, ob Ihre viewcontrollers (gamevc und winvc) vorgestellt, Modal, oder geschoben werden. Verwenden Sie einen navigation-controller?
Der Grund, warum es nicht funktioniert, weil selbst.presentingViewController ist einem in Fertigstellung
Nils du hast Recht, es ist null-Werte zulässig sind. Eine Möglichkeit ist die Erfassung der presentingViewController in eine variable, bevor die hand. Gerade getestet und es sollte funktionieren.
Ich denke, du hast Recht... Es scheint ein memory-leak, auch wenn das Spiel VC abgewiesen wurde. Dann, wie kann ich ignorieren Sie die gameVC selbst nicht gerade ein Kind von ihm? Würde die delegation die einzige Möglichkeit sein? (p.s. jeder übergang wird durchgeführt als eine "show", ich bin mir nicht sicher, ob das ist -, modal-oder push...)
InformationsquelleAutor
Sollten Sie in der Lage sein zu rufen:
(Möglicherweise müssen Sie hinzufügen
?
oder!
irgendwo - ich bin kein swift-Entwickler)Es hat geklappt! Ich fügte hinzu: selbst.dismissViewControllerAnimated(true, Fertigstellung: {}) self.presentingViewController?.dismissViewControllerAnimated(true, Fertigstellung: {})
Ich srsly nicht verstehen, die downvotes. Dies wird tatsächlich tun, was der OP fordert.
Sie ' ll have to go up eine weitere Ebene, in der Lage sein, zu entlassen, sowohl die modal-view-Controller. Wenn ich mich nicht Irre, dismissViewControllerAnimated arbeiten durch die Entlassung der unmittelbaren child-view-controller und alles oberhalb des stack. Nur entlässt sich selbst, wenn Ihr den aktuell präsentierten view-controller (für die die Delegierten die Nachricht an Ihre Präsentation-view-controller). Siehe developer.apple.com/library/ios/documentation/UIKit/Reference/...:
ist Recht, ich änderte ein bisschen code hier.
InformationsquelleAutor
Spezielle unwind segue soll roll back view-stack zu bestimmten view-controller. Bitte siehe meine Antwort hier: wie zu entlassen, 2 view-controller swift-ios?
InformationsquelleAutor
Hatte ich einige Animations-Probleme, wenn Sie versuchen, die akzeptierte Antwort auf meine Bewerbung. Die zuvor dargestellten Ansichten wären flash oder versuchen Sie zu animieren auf dem Bildschirm. Das war meine Lösung:
InformationsquelleAutor