LoginSignup
12
12

More than 5 years have passed since last update.

NSWindowをProgramaticallyに生成する

Last updated at Posted at 2015-06-05

NSWindowをProgramaticallyに生成する

タイトル通り、別ウィンドウをInterface Builder(以下IB)を使用せずに、コードで生成する方法を紹介します。また、生成したウィンドウの表示、閉じ、破棄の仕方も簡単に紹介します。

メインのウィンドウをIBで作る

Screen Shot 2015-06-05 at 10.29.58 PM.png

単純に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.
        }
    }
}

#結果
Screen Shot 2015-06-05 at 10.47.13 PM.png

参考

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12