2015-08-10 23 views
7

Tôi hiện đang cố gắng hiển thị một cửa sổ với bộ điều khiển cửa sổ. Đó là những gì tôi có:self.window luôn luôn là nil

NSWindow lớp con

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 lớp con:

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) 
} 
} 

Tất nhiên, tôi đã có một .xib-file, quá, có chứa cửa sổ của tôi. Nó được gọi là "TweetWindow.xib". Bây giờ, cho đến nay điều này sẽ là ok.

Trong AppDelegate.swift của tôi, tôi làm như sau:

@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); 
} 
} 

Vấn đề của tôi là như sau: Khi tôi cố gắng nhấp chuột vào nút của tôi được liên kết với các IBAction xuống đó để hiển thị các cửa sổ, một ngoại lệ được ném ở đây: var tweetWindow: TweetWindow {return self.window as! TweetWindow; }

Nó nói lỗi nghiêm trọng: bất ngờ tìm thấy con số không trong khi unwrapping một giá trị bắt buộc, vì vậy cửa sổ là con số không.

Tại sao cửa sổ lại ở đó? Tôi đang cố gắng truy cập vào giá trị quá sớm hay gì đó?

Dưới đây là một số hình ảnh:

Window

File's Owner

File's Owner Identity Inspector

Cảm ơn.

Trả lời

4

Khởi tạo phiên bản NSWindowController hoặc một phân lớp không không tải NIB. NIB không được tải cho đến khi thuộc tính window được truy cập hoặc phương pháp showWindow() được gọi (về cơ bản truy cập trực tiếp thuộc tính window). Trong trường hợp của bạn, vì bạn đang ghi đè showWindow(), điều quan trọng là phải biết rằng NIB không được tải cho đến khi thực hiện siêu lớp được gọi.

Vì vậy, có, gọi tới số self.tweetWindow.windowWillShow() trong ghi đè showWindow() của bạn, trước khi gọi đến siêu, quá sớm. NIB chưa được tải tại thời điểm đó, vì vậy đầu ra window chưa được kết nối với bất kỳ thứ gì.

Tất nhiên, bạn phải đảm bảo ổ cắm thực sự được kết nối trong NIB hoặc nó sẽ không bao giờ được kết nối, ngay cả sau khi NIB được nạp. Nhưng cố gắng truy cập nó trước khi nó được tải là vấn đề đầu tiên.

Tôi nghĩ phương pháp windowWillShow() của bạn là sai lầm, ít nhất là khi được triển khai. Cửa sổ có thể được hiển thị theo nhiều cách khác nhau, không chỉ bằng phương pháp showWindow() của bộ điều khiển cửa sổ. Ví dụ, một cái gì đó bên ngoài của cả hai cửa sổ và bộ điều khiển cửa sổ có thể làm tweetWindowController.window.makeKeyAndOrderFront(nil).Nếu bạn thực sự muốn làm một cái gì đó như thế này, có lớp cửa sổ ghi đè lên các phương thức order...() khác nhau để xem cửa sổ có được đặt hàng lần đầu tiên không và nếu có, hãy gọi phương thức của bạn.


Cập nhật:

Bạn có một vài điều trong cấu hình không phù NIB của bạn. Dưới đây là những gì bạn cần làm để khắc phục chúng:

  • Phá kết nối hiện tại khỏi cửa sổ "ủy quyền" của Chủ sở hữu tệp vào cửa sổ. Nhấp vào nút "x" nhìn thấy trong một trong các ảnh chụp màn hình bạn đã đăng.
  • Thay đổi lớp Chủ sở hữu tệp. Hiện tại là TweetWindow. Nó phải là TweetWindowController. Bộ điều khiển là những gì tải và sở hữu NIB, vì vậy lớp của Chủ sở hữu tệp phải là lớp bộ điều khiển.
  • Kết nối cửa sổ "cửa sổ" của Chủ sở hữu tệp với cửa sổ.
  • Kết nối cửa sổ "đại biểu" của cửa sổ với Chủ sở hữu tệp.
+0

Tôi đã xóa hàm overriden ("showWindow") nhưng nó vẫn ném cho tôi ngoại lệ trong "windowDidLoad". Dường như ổ cắm bị hỏng hoặc như thế. Tôi đã kết nối đại biểu với Chủ sở hữu tệp nhưng không có thay đổi nào. –

+0

"Tôi đã kết nối đại biểu với Chủ sở hữu tệp" Điều quan trọng không phải là đại biểu của cửa sổ được kết nối với Chủ sở hữu tệp. Đó là ổ cắm cửa sổ của Chủ sở hữu tệp được kết nối với cửa sổ. Những thứ khác cần kiểm tra: lớp của Chủ sở hữu tập tin trong cửa sổ NIB là 'TweetWindowController', đúng không? Có phải bạn có thể khởi tạo một thể hiện khác của lớp đó trong NIB? Tức là, bạn đã kéo một "đối tượng" vào NIB và đặt lớp của nó thành 'TweetWindowController'? Nếu vậy, hãy xóa nó khỏi NIB. –

+0

Tôi đã thay đổi điều đó để đại diện cửa hàng của Chủ sở hữu tệp bây giờ đề cập đến cửa sổ. Lớp Chủ sở hữu tệp đã là "TweetWindow". Tôi đã thử nó với TweetWindowController, nhưng ngoại lệ vẫn xuất hiện. Nhưng điều đó sẽ không có ý nghĩa thì sao? Tôi không có các đối tượng khác đã đặt "TweetWindowController" làm lớp trong NIB của tôi, vì vậy không thể đây là nguồn gốc của ngoại lệ, tôi nghĩ vậy. –

Các vấn đề liên quan