2014-12-22 12 views
5

पर एक दृश्य जोड़ना मैं अपने गेम पर एक विराम स्क्रीन बनाने की कोशिश कर रहा हूं। मैं स्टोरीबोर्ड आईडी के साथ अपने स्टोरीबोर्ड में एक 'PauseScreen' ViewController जोड़ लिया है और बहाली आईडी के रूप में "PauseScreenID" की स्थापना की और रोकें स्क्रीन मैं "GameScene" में समारोह बनाया है की है, ले जाने के लिए:विंडो पदानुक्रम

func pauseSceenTransition(){ 

    let viewController = UIStoryboard(name: "Main", bundle:nil).instantiateViewControllerWithIdentifier("PauseScreenID") as UIViewController 

    let currentViewController = (UIApplication.sharedApplication().delegate as AppDelegate) 

    currentViewController.window?.rootViewController?.presentViewController(viewController, animated: false, completion: nil) 
} 

लेकिन जब यह कहा जाता हो जाता है, मैं त्रुटि मिलती है:

चेतावनी: पर < AppName .StartScreenViewController 0x7fae61fe5ff0>: 0x7fae61f79980> जिसका दृश्य खिड़की पदानुक्रम में नहीं है < AppName .PauseScreen पेश करने के लिए प्रयास!

"स्टार्टस्क्रीन व्यू कंट्रोलर" मेरी स्टार्ट स्क्रीन के लिए व्यू कंट्रोलर है और प्रारंभिक दृश्य नियंत्रक है। यह तब "गेमसेन" पर जाता है, जहां "पॉज़स्क्रीन" जाने की आवश्यकता होती है। यह काम करता है तो मुझे लगता है कि मैं दूसरी पंक्ति को बदलने की जरूरत है, तो मैं प्रारंभिक दृश्य नियंत्रक "GameViewController"/"GameScene" बनाना:

let currentViewController = (UIApplication.sharedApplication().delegate as AppDelegate) 
तो

है कि यह "GameViewController" पर "PauseScreen" प्रस्तुत कर रहा है , "StartScreenViewController" पर नहीं, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।

उत्तर

11

त्रुटि आपको बता रही है कि क्या हो रहा है।

Warning: Attempt to present <AppName.PauseScreen: 0x7fae61fe5ff0> on <AppName.StartScreenViewController: 0x7fae61f79980> whose view is not in the window hierarchy!

(UIApplication.sharedApplication().delegate as AppDelegate).window?.rootViewControllerStartScreenViewController का एक उदाहरण की ओर इशारा करते है। यह खराब है: rootViewController को GameScene के उदाहरण को इंगित करना चाहिए।

मूल कारण यह होना चाहिए कि GameScene प्रस्तुत किया गया है। अपने विवरण से:

"StartScreenViewController" दृश्य नियंत्रक है ... यह तो "GameScene" को जाता है ...

यह होना चाहिए जहां आपकी समस्या है। StartScreenViewController से आप GameScene पर कैसे जाते हैं?

मेरा अनुमान है कि आप एप्लिकेशन में एक नई विंडो जोड़ रहे हैं। आपको इसके बजाय rootViewController सेट करने की आवश्यकता है।

let gameScene = UIStoryboard(name: "Main", bundle:nil).instantiateViewControllerWithIdentifier("GameSceneID") as UIViewController 
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
appDelegate.window?.rootViewController = gameScene 

जब आप वापस शुरू स्क्रीन पर जाने, आप फिर से rootViewController निर्धारित किया है।

let initialViewController = UIStoryboard(name: "Main", bundle:nil).instantiateInitialViewController() as UIViewController 
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 
appDelegate.window?.rootViewController = initialViewController 

आप transitionFromViewController(,toViewController:, duration:, options:, animations:, completion:) का उपयोग रूट दृश्य नियंत्रक की स्थापना चेतन कर सकते हैं।

+0

हाय, मुझे अब इस मुद्दे के साथ परेशानी हो रही है, और इस बात की उत्सुकता है कि समाधान पिछले साढ़े सालों में बदल गया है या नहीं। मैं एक बटन के अंदर एक नेस्टेड 'if' के भीतर से 'UIAlertController' को कॉल करने का प्रयास कर रहा हूं। बटन के भीतर नियमित 'if' कथन' UIAlertView' के ठीक प्रदर्शन को प्रदर्शित करते हैं, लेकिन यदि सही बयान उपरोक्त त्रुटि को फेंक देते हैं तो उनके 'सत्य' परिणाम प्रदर्शित होते हैं। – Ethan

+0

@Ethan कभी-कभी आपको 'UIAlertController' को http: // stackoverflow में रखने के लिए विंडो बनाने की आवश्यकता होती है।कॉम/प्रश्न/26554894/कैसे-से-present-uialertcontroller-when-not-in-a-view-नियंत्रक –

+0

जो कुछ भी आप जानते हैं वह तेज़ी से लिखा गया है? – Ethan

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