NSApplication を使うコードを簡単に
Cocoa では AppKit の多くの機能が、NSApplication に依存している。こういった処理を、RubyCocoa でのスクリプト(アプリケーションでなく)で動作させるのがめんどい。とくにテストコードを書くときに、こういう状況がけっこうある。
サンプルの HelloWorld.rb にあるように、
- delegate 用のオブジェクトを用意
- NSApplication.sharedApplication で アプリケーションを生成
- 2. のアプリケーションの delegate として 1. をセット
- アプリケーション を run で実行
- (処理が終わったら)アプリケーションを terminate: で終了
とするのがセオリー。これを簡単に扱う方法を、RubyCocoa 側で用意しておくといいかなと思って書いてみた。
require 'osx/cocoa' module OSX class TempDelegate < OSX::NSObject attr_accessor :proc attr_reader :result def initialize @result = nil end def applicationDidFinishLaunching(notification) begin @result = @proc.call ensure OSX::NSApplication.sharedApplication.terminate(self) end end end def NSApplication.run_with_new_runloop(&proc) delegate = TempDelegate.alloc.init delegate.proc = proc app = NSApplication.sharedApplication app.setDelegate(delegate) app.run return delegate.result end end
使いかたはこんな感じ。
OSX::NSApplication.run_with_new_runloop { # your code # : }
ブロック付きメソッドてば便利。メソッドの名前をもうちょっと検討したら、devel で本体に取り込めるか提案してみよう。こういった細かいところも整備していきたいよな。
| 固定リンク
最近のコメント