NSWindowをProgramaticallyに生成する
タイトル通り、別ウィンドウをInterface Builder(以下IB)を使用せずに、コードで生成する方法を紹介します。また、生成したウィンドウの表示、閉じ、破棄の仕方も簡単に紹介します。
メインのウィンドウをIBで作る
単純にCreateとCloseボタンを作ります。
Createボタンを押すことでNSWindow生成を、さらに生成後に押す場合は生成したNSWindowを表示する機能をつけます。
Closeボタンは生成されたNSWindowを破棄せずに、閉じる機能をつけます。
修正 2015.Nov
Swift 2.0 以降、NSWindowの生成方法の、最後の引数deferについて、''で囲む必要があります。
main.c
self.window = NSWindow(contentRect: NSMakeRect(0, 0, 640,480),
styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask,
backing: NSBackingStoreType.Buffered,
`defer`: false)
コード
main.c
import Cocoa
import Foundation
class ViewController: NSViewController {
//生成するwindow
var windowA:NSWindow?
//生成完了後はtrue
var windowAFlag:Bool = false
//windowAをコントロールするクラス
var windowAControl: NSWindowController?
//CreateボタンのAction
@IBAction func OpenWindow(sender: AnyObject) {
//windowが未生成の場合は生成する
if(!self.windowAFlag){
self.windowA = NSWindow(contentRect: NSMakeRect(0, 0, 640,480), styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask, backing: NSBackingStoreType.Buffered, defer: false)
self.windowA!.title = "New Window"
self.windowA!.opaque = false
self.windowA!.center()
self.windowA!.movableByWindowBackground = true
self.windowA!.backgroundColor = NSColor(calibratedHue: 0, saturation: 1.0, brightness: 0.5, alpha: 0.7)
self.windowA!.makeKeyAndOrderFront(nil)
self.windowAControl = NSWindowController(window:self.windowA)
self.windowAFlag = true
}else{//windowがすでに生成されている場合はNSWindowControllerを使用してwindowを表示
self.windowAControl!.showWindow(nil)
}
}
//Closeボタン用のAction
@IBAction func CloseWindow(sender: AnyObject) {
//NSWindowクラスのclose()は、生成したwindowを破棄する
//self.windowA!.close()
//単純に閉じたい場合はNSWindowControllerのclose()を使う
self.windowAControl!.close()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: AnyObject? {
didSet {
// Update the view, if already loaded.
}
}
}
参考