NSWindow をもう一つ作成するメニューを付ける。
実行すると一瞬表示されて即座に消えて無くなる。
NSApp.windows プロパティの数は増えていない、何故だ?
backingType – Cocoa API解説(macOS/iOS)
全然関係ないページだけどこの Swift コードは何?
作った Window は自前の配列とかで保持しなきゃいけないのかよ。
NSApp は作成した Window を保持してくれないってことみたい。
GtkApplicationWiondow と違い引数に app 指定が無いからそりゃそうかと。
つまり、ガベージコレクションで破棄されてしまうってことだ。
class ComipoliWindow(NSWindow): # Avoid garbage collection avoid_gc = [] def init(self): frame = NSMakeRect(100, 400, 800, 480) objc.super(ComipoliWindow, self).initWithContentRect_styleMask_backing_defer_( frame, NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask, NSBackingStoreBuffered, False) # etc... return self @classmethod def new_window(self): window = ComipoliWindow.new() self.avoid_gc.append(window) window.makeKeyAndOrderFront_(window) return window
グローバル変数にしたくないからこんな classmethod を作ってみた。
大量にウインドウが作られるのものではないならアプリ終了まで保持でいい。
applicationDidFinishLaunching で Window が作れないって検索で見かける。
Objective-c, Swift も参照カウンタだから同じなんだろう。
初心者コードでは NSApp.run の前にウインドウを作るから破棄されないだけ。
後、NSMenu に View を定義すると勝手に ‘Show Tab Bar’ が挿入される。
‘Enter Full Screen’ も入るけど command+control+F は使えない。
iOSな日々: macOS Sierra非互換:「表示」メニューに「タブバーを表示」項目が自動的に追加される(非表示化対応)
なんて迷惑な仕様なんだよ。
‘Enter Full Screen’ は自前で command+control+F を定義すると消える。
#!/usr/bin/env python3 from AppKit import * from comipoli_window import ComipoliWindow from comipoli_menu import ComipoliMenu class AppDelegate(NSObject): def applicationDidFinishLaunching_(self, notification): ComipoliWindow.new_window() def main(): NSApplication.sharedApplication() NSApp.setMainMenu_(ComipoliMenu.new()) NSApp.setDelegate_(AppDelegate.new()) NSApp.activateIgnoringOtherApps_(True) # Hide Auto Tab Bar NSWindow.setAllowsAutomaticWindowTabbing_(False) # run NSApp.run()
色々なんとかなった。
しかし、AppKit は GTK+ より日本語情報が多いのはいいんだけーが。
みんな Xcode の使い方ばかり勉強して肝心のコードがほとんど無いよな。
統合開発環境ってコードだけでアプリが作れる人が使って初めて便利だと思うもの。
であるはずなんだけど、これではプログラミングが面白いと思う人なんて増えないよ。