環境設定ウィンドウ(nib ファイルを作る)

ここでは、RubyCocoa アプリケーションで、環境設定を新規に Nib ファイルを追加して作る方法をメモする。

基本手順

まず、Preference.rb という、Ruby NSObject Subclass ファイルを Classes に追加する。

次に、Interface Builder で、メニューの File から New... を選ぶ。

Cocoa の Empty(空の Cocoa テンプレート)を選ぶ。

これを Preferences.nib として保存する。この例では、window sample というプロジェクトなので、そのフォルダに保存する。

このとき、File Type には Interface Builder Cocoa Document (NIB 3.x) を選んでおく。xib は作業段階で使うもので、最終的には NIB にするらしいが、よくわかってない。

これを今開いている Xcode プロジェクトに追加するか聞かれるので、追加したいものを選ぶ。

すると、window sample 直下に保存される。

このままでもかまわないが、見やすくするために、MainMenu.nib と同じ Resources に移動させる。

さらに、MainMenu.nib と同じように、ローカライズできるような形にしておくと、実際のファイルも同じフォルダに移る。

Preferences.nib を右クリックして、情報を見るを選ぶ。

一般の下の方にあるファイルをローカライズ可能にするをクリックする。

この例では、nib ファイルの最初が小文字から大文字にかわっているが、気にしない(やり直したときにかえただけ)。

実際のファイルも移動している。

ここで、移動しているので、Interface Builder の方で一度 nib ファイルを閉じて、Xcode の Preferences.nib を

ダブルクリックしてもう一度開く。

次に、この Nib ファイルに Library から WIndow を選んで追加する。

追加したら、名前を Preferences とかにしておくといい。

次に、Xcode に戻って Preferences.rb に prefWindow(何でもよい)という outlet を追加する。

そして、MainMenue.nib を開いて、Library から Object を選んで追加して、Inspector で Class を Preferences にする。

もし、Ruby NSObject Subclass を違う名前で作った場合はその名前を選ぶ。

ここで、また、Preferences.nib に戻り、File's Owner のクラスも Preferences にする。

そうすると、Preferences.nib の File's Ownder の Outlet に prefWindow が現れるので、それをさっき追加した Window に結びつける。

この Window は環境設定なので、起動時に見えては困るし、閉じてもリリースされては困るので、

Release When ClosedVisible At Launch のチェックを外しておく。

ここで、Xcode に戻って、Preferences.nib ファイルにこの nib ファイルを開くメソッドを追加する。

ここでは、showPrefWindow としておく。

def showPrefWindow(sender) end ib_action :showPrefWindow

Preferences という nib ファイルを開きたいので、NSBundle クラスの loadNibNamed_owner(nib,owner) というメソッドを使う。

NSBundle.loadNibNamed_owner("Preferences",self)

これで、nib ファイルが起動したら、prefWindow を makeKeyAndOrderFront というメソッドで前面に持ってくる。

@prefWindow.makeKeyAndOrderFront(sender)

まとめると Preferences.rb の中身は、こんな感じ。

これで使ってたんだけど、これだと毎回 nib ファイルを起動して新しいウィンドウを作るので、それを避けるために

NSBungle.loadNibNamed_owner("Preferences",self)

の所をちょっと変えて、

@prefNib = NSBungle.loadNibNamed_owner("Preferences",self) if @prefNib == nil

としてみた。こうすると、最初にこのメソッドが呼ばれたときだけ、つまり最初に環境設定ウィンドウが開いたときだけ

nib ファイルが呼び起こされて、次からはウィンドウが開くだけになる。上で設定したように、Release when closed の

オプションが外してあるので、ウィンドウを閉じても画面上から消えるだけで情報は保持されているので、それを呼び出して

前面にするだけで問題なく使えるから。

最後に、最初からメニューにある Preferences... につなげたいので、今作った showPrefWindow と結びつける。

これで、アプリケーションを起動して、Preferences... を選ぶと、Preferences ウィンドウが開く。

あとは、Preferences ウィンドウに必要なものを追加していく。それはまた別の項目で。

補足

AppController(メインの NSObject Sub Class ファイル)から Preferences ウィンドウを操作する。

サブクラスファイルから別のサブクラスファイルにアクセスする方法を見つけた。

これで、AppController(メインの NSObject Sub Class ファイル)から Preferences のメソッドにアクセスできる。

(outlet にアクセスする方法はまだわからない)とりあえず、スクリーンショットはなしで、方法のメモだけ。

まず、ここの上の方で説明してある方法で Preferences の nib ファイルと sub class ファイルを作って、いろいろ設定する。

違うところは、showPrefWindow のメソッドの中には、makeKeyAndOrderFront(sender) だけを記述しておく。

def showPrefWindow(sender) @prefWindow.makeKeyAndOrderFront(sender) end

これで、AppController のファイルに戻り、こっちにも showPrefWindow を作って、これを呼び出して Preferences ウィンドウを開くようにする。

まず、Preferences のファイルにアクセスするために require で読み込む設定をする。

require 'Preferences'

次に showPrefWindow メソッドを作り、@preferences という Preferences サブクラスのオブジェクトを作る。

これは、一度作ったらまた作ることを避けたいので、@preferences が nil でないときだけ作る。と同時に、

Preferences の nib ファイルを読み込む。owner は Preferences サブクラスなので、@preferences にする。

そして、最後に Preferences サブクラスの showPrefWindow を実行して、Preferences ウィンドウを開く。

def showPrefWindow (sender)

if @preferences.nil?

@preferences = Preferences.alloc.init

NSBundle.loadNibNamed_owner("Preferences",@preferences)

end

@preferences.showPrefWindow(self)

end

ib_action :showPrefWindow

これで、メニューの Preferences... のアイテムをこの AppCotroller の action に結びつける。

ついでに、これを応用して、すべてのウィンドウが閉じたらアプリケーションを終了する設定がしてあるときに、

メインのウィンドウが閉じたら Preferences のウィンドウも閉じてちゃんと終了できるようにする。

アプリケーションの挙動にも書いたけど、この設定をするには、MainMenu.nib の File's Owner とメインのウィンドウの

delegate を AppController に結びつけておく。そして次の delegate メソッドを加える。

def applicationShouldTerminateAfterLastWindowClosed(sender) true end

これで、すべてのウィンドウが閉じたらアプリケーションが終了するようになる。

次に、メインのウィンドウが閉じるときに Notification を拾って Preferences のウィンドウを閉じるようにする。

このために、まず、Preferences のサブクラスファイルに windowClose というメソッドを追加しておく。

def windowClose(sender) @prefWindow.performClose(self) end

これを windowWillClose で Notification を拾ったときに呼び出す。他に delegate を設定したウィンドウがなければ、

Notification を送ったウィンドウを確認する必要はないと思う。ちなみに @window はメインのウィンドウの outlet。

def windowWillClose(notification) @preferences.windowClose(self) if notification.object.to_s == @window.to_s end

これで、ちゃんとうまく行くはず。

Document-based アプリケーションに環境設定(Preferences.nib)を追加する。

Document-based アプリケーションでは、ウィンドウの管理を NSWindowController がするので、普通の NSObject のサブクラスの場合と

少しやり方が違う。Document-based アプリケーションを作るで作ったアプリケーションに環境設定を加えてみる。

まず、NSObject と NSWindowController のサブクラスのファイルを作る。NSWindowController のサブクラスのテンプレートはないので、

NSObject のサブクラスファイルを2つ作り、一つを NSWindowController のサブクラスにする。名前は AppController.rb と PrefController.rb にしておく。

PrefController.rb の方は、次のように変える。

class PrefController < OSX::NSWindowController

次に、ここの上の方で説明してあるように Preferences.nib を作り、環境設定ウィンドウを設定する。File's Owner の Class は PrefController にする。

あと、File's Owner に window という outlet があるので、それと Preferences.nib に作ったウィンドウを結びつける。

MainMenu.nib に NSObject を追加して Class は AppController にする。AppController.rb の中では、PrefController にアクセスできるように、

require する。

require 'PrefController'

これに、Preferences のウィンドウが開けるように showPrefWindow というメソッドを加える。ここの前の項目でやったのと似てる。

まず、PrefController のオブジェクトがなければ作るようにする。ここの PrefController は NSWIndowController のサブクラスなので、

showWindow(sender) で Preferences ウィンドウを表示させるように設定する。できたら、これの action をメニューの Preferences... に結びつける。

def showPrefWindow (sender) if @prefController.nil? then @prefController = PrefController.alloc.init end @prefController.showWindow(self) end ib_action :showPrefWindow

PrefController.rb の中には windowNibName で、"Preferences" を追加する。

def windowNibName "Preferences" end

これで、Document-base アプリケーションで環境設定が使える。