2015-08-10 12 views
7

मैं वर्तमान में एक विंडो नियंत्रक के साथ एक विंडो प्रदर्शित करने की कोशिश कर रहा हूँ। है यही कारण है कि मैं क्या है:self.window हमेशा शून्य

NSWindow उपवर्ग

import Cocoa 
import CoreLocation 

class TweetWindow: NSWindow { 

var locationManager: CLLocationManager! 
var geoCoder: CLGeocoder! 

@IBAction func tweetButtonPressed(sender:NSButton) { 

} 

func initialize() { 
    self.titleVisibility = NSWindowTitleVisibility.Hidden; 
    self.locationManager = CLLocationManager(); 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; 
    self.locationManager.distanceFilter = 10; 

    self.geoCoder = CLGeocoder(); 
} 

func windowWillShow() { 
    if !self.visible { 
     let systemAppearanceName = (NSUserDefaults.standardUserDefaults().stringForKey("AppleInterfaceStyle") ?? "Light").lowercaseString; 
     let systemAppearance = systemAppearanceName == "dark" ? NSAppearance(named: NSAppearanceNameVibrantDark) : NSAppearance(named: NSAppearanceNameVibrantLight); 
     self.appearance = systemAppearance; 

     self.locationManager.startUpdatingLocation(); 
    } 
} 

func windowWillClose() { 
    self.locationManager.stopUpdatingLocation(); 
} 
} 

NSWindowController उपवर्ग:

import Cocoa 

class TweetWindowController: NSWindowController { 

var tweetWindow: TweetWindow { return self.window as! TweetWindow; } 

override func windowDidLoad() { 
    super.windowDidLoad() 
    self.tweetWindow.initialize() 
    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. 
} 

override func showWindow(sender: AnyObject?) { 
    self.tweetWindow.windowWillShow() 
    super.showWindow(sender) 
} 
} 

बेशक, मैं एक .xib-फ़ाइल मिल गया है, भी, कि मेरे खिड़की में शामिल है। इसे "TweetWindow.xib" कहा जाता है। अब, अब तक यह ठीक होना चाहिए।

मेरी AppDelegate.swift में मैं निम्नलिखित है:

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

var tweetWindowController:TweetWindowController!; 

func applicationDidFinishLaunching(aNotification: NSNotification) { 
    // Insert code here to initialize your application 
    tweetWindowController = TweetWindowController(windowNibName: "TweetWindow"); 
} 

func applicationWillTerminate(aNotification: NSNotification) { 
    // Insert code here to tear down your application 
} 

func showTweetWindowInternal() { 
    NSApp.activateIgnoringOtherApps(true); 
    tweetWindowController.showWindow(nil); 
} 

@IBAction func showTweetWindow(sender: AnyObject) { 
    showTweetWindowInternal(); 
} 

@IBAction func quitApp(sender: AnyObject) { 
    NSApplication.sharedApplication().terminate(self); 
} 
} 

मेरे समस्या निम्नलिखित है: जब मैं खिड़की दिखाने के लिए मेरी बटन है कि वहाँ नीचे IBAction साथ जुड़ा हुआ है पर क्लिक करने की कोशिश, एक अपवाद यहां फेंक दिया गया है: var tweetWindow: TweetWindow {खुद को वापस करें। विन्डो के रूप में! TweetWindow; }

यह गंभीर त्रुटि का कहना है: अप्रत्याशित रूप से, जबकि एक वैकल्पिक मूल्य unwrapping शून्य पाया, इसलिए खिड़की नहीं के बराबर है।

खिड़की शून्य क्यों है? क्या मैं मूल्य को बहुत जल्दी या कुछ तक पहुंचने की कोशिश कर रहा हूं?

यहाँ कुछ तस्वीरें हैं:

Window

File's Owner

File's Owner Identity Inspector

धन्यवाद।

उत्तर

4

NSWindowController का एक उदाहरण आरंभ किया जा रहा है या एक उपवर्ग नहीं लोड निब करता है। निब लोड नहीं है जब तक window संपत्ति पहुँचा जा सकता है या showWindow() विधि कहा जाता है (जो मूल रूप से window संपत्ति परोक्ष रूप से तक पहुँचता है)। आपके मामले में, चूंकि आप showWindow() ओवरराइड कर रहे हैं, इसलिए यह जानना महत्वपूर्ण है कि एनआईबी लोड नहीं किया जाता है जब तक कि सुपरक्लस कार्यान्वयन नहीं कहा जाता है।

तो, हाँ, अपने showWindow() ओवरराइड में self.tweetWindow.windowWillShow() करने के लिए अपने कॉल, सुपर करने के लिए के माध्यम से कॉल करने से पहले, बहुत जल्दी है। उस बिंदु पर एनआईबी लोड नहीं किया गया है, इसलिए window आउटलेट किसी भी चीज़ से जुड़ा नहीं गया है।

बेशक

, आप के बाद भी निब भरी हुई है यकीन है कि दुकान वास्तव में निब में जुड़ा हुआ है या इसे जोड़ा जा कभी नहीं होगा बनाने के लिए है। लेकिन लोड होने से पहले इसे एक्सेस करने का प्रयास करना पहली समस्या है।

मुझे लगता है कि अपने windowWillShow() विधि गुमराह है, लागू किया कम से कम के रूप में। खिड़की नियंत्रक की showWindow() विधि से नहीं, खिड़की को विभिन्न तरीकों से दिखाया जा सकता है। उदाहरण के लिए, खिड़की और खिड़की नियंत्रक दोनों के बाहर कुछ tweetWindowController.window.makeKeyAndOrderFront(nil) कर सकता है।यदि आप वास्तव में ऐसा कुछ करना चाहते हैं, तो विंडो क्लास को विभिन्न order...() विधियों को ओवरराइड करें ताकि यह देखने के लिए कि विंडो पहली बार ऑर्डर की जा रही है या नहीं, और यदि ऐसा है, तो अपनी विधि को कॉल करें।


अद्यतन:

आपके पास कई चीजें अपने निब में गलत कॉन्फ़िगर। यहां उन्हें ठीक करने के लिए आपको क्या करना है:

  • फ़ाइल के मालिक के "प्रतिनिधि" आउटलेट से वर्तमान कनेक्शन को विंडो में तोड़ दें। आपके द्वारा पोस्ट किए गए स्क्रीनशॉट में से किसी एक में "x" बटन पर क्लिक करें।
  • फ़ाइल के मालिक की कक्षा बदलें। यह वर्तमान में TweetWindow है। यह TweetWindowController होना चाहिए। नियंत्रक एनआईबी का भार और मालिक है, इसलिए फ़ाइल के मालिक का वर्ग नियंत्रक वर्ग होना चाहिए।
  • फ़ाइल के स्वामी के विंडो में "विंडो" आउटलेट कनेक्ट करें।
  • फ़ाइल के मालिक को विंडो के "प्रतिनिधि" आउटलेट से कनेक्ट करें।
+0

मैंने ओवर्रिडेन फ़ंक्शन ("शोविंडो") हटा दिया लेकिन यह अभी भी मुझे "विंडोडिडलोड" में अपवाद फेंकता है। ऐसा लगता है कि आउटलेट असफल रहा है या ऐसा कुछ है। मैंने प्रतिनिधि को फाइल के मालिक से जोड़ा लेकिन कोई बदलाव नहीं। –

+0

"मैंने प्रतिनिधि को फाइल के मालिक से जोड़ा" महत्वपूर्ण बात यह नहीं है कि खिड़की का प्रतिनिधि फ़ाइल के मालिक से जुड़ा हुआ है। यह है कि फ़ाइल के मालिक का विंडो आउटलेट विंडो से जुड़ा हुआ है। अन्य चीजों की जांच करने के लिए: विंडो में फ़ाइल के मालिक की कक्षा एनआईबी 'TweetWindowController' है, है ना? क्या आपने शायद एनआईबी में उस वर्ग का एक और उदाहरण तत्काल किया था? यही है, क्या आपने एनआईबी में "ऑब्जेक्ट" खींच लिया और अपनी कक्षा को 'TweetWindowController' पर सेट किया? यदि ऐसा है, तो एनआईबी से इसे हटा दें। –

+0

मैंने इसे बदल दिया ताकि फ़ाइल के मालिक का आउटलेट प्रतिनिधि अब विंडो को संदर्भित कर सके। फ़ाइल के मालिक का वर्ग "TweetWindow" रहा है। मैंने TweetWindowController के साथ इसे आजमाया, लेकिन अपवाद अभी भी दिखाई देता है। लेकिन फिर भी यह समझ में नहीं आता है, है ना? मेरे पास कोई अन्य ऑब्जेक्ट नहीं है जिसने मेरे एनआईबी में कक्षा के रूप में "TweetWindowController" सेट किया है, इसलिए यह संभव नहीं है कि यह अपवाद का स्रोत है, मुझे लगता है। –

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