2015-01-19 18 views
6

Chcę utworzyć programowo nowe okno za pomocą Swift, ale Nie mogłem znaleźć sposobu na sukces. Ten prosty kod nie wyświetla nowego okna. Co jest nie tak z moim kodem?Utwórz programowo NSWindow w Swift

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 

    func applicationDidFinishLaunching(aNotification: NSNotification) { 
     let win = NSWindow(contentRect: NSMakeRect(100, 100, 600, 200), 
      styleMask: NSResizableWindowMask, 
      backing: NSBackingStoreType.Buffered, defer: true) 
     let controller = NSWindowController(window: win) 
     controller.showWindow(self) 
     win.makeKeyAndOrderFront(win) 
    } 
} 
+3

"Co się stało z moim kodzie?" Jedną z rzeczy, która jest oczywiście błędna, jest to, że wszystkie zmienne są lokalne. Tak więc kontroler okien i twoje okno znikają w obłoku dymu, gdy funkcja dobiega końca. Są to obiekty wyłącznie tymczasowe. – matt

+0

Chciałbym, żeby była jakaś odpowiednia dokumentacja na ten temat. Nie można znaleźć żadnego. – DisplayName

Odpowiedz

6
import Cocoa 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 
    let newWindow = NSWindow(contentRect: NSMakeRect(0, 0, NSScreen.main()!.frame.midX, NSScreen.main()!.frame.midY), styleMask: [.closable], backing: .buffered, defer: false) 
    func createNewWindow() { 
     newWindow.title = "New Window" 
     newWindow.isOpaque = false 
     newWindow.center() 
     newWindow.isMovableByWindowBackground = true 
     newWindow.backgroundColor = NSColor(calibratedHue: 0, saturation: 1.0, brightness: 0, alpha: 0.7) 
     newWindow.makeKeyAndOrderFront(nil) 
    } 
    func applicationDidFinishLaunching(_ notification: Notification) { 
     createNewWindow() 
    } 
    func applicationWillTerminate(_ notification: Notification) { 
     // Insert code here to tear down your application 
    } 
} 

Window Style Mask

+0

Auto-layout musi być królewskim bólem, jeśli zostanie zrobiony w tym stylu :) –

+0

Rzeczywiście tak jest, ale spójrz na masonry na github (https://github.com/SnapKit/Masonry) i jest jeszcze kilka innych opcji (ReactiveCocoaLayout jest dobry, jeśli lubisz RX/Reactive) –

+3

Ten nie działa dla mnie – DisplayName