2011年1月29日土曜日

MacRuby・環境設定ウィンドウその5

PopupButtonとController側のアクションを結びつけると、PopupButtonで選択アイテムが変更されたあとにメソッドが呼ばれる。

そのタイミングでselectedItemを保存してしまえばとりあえずOKだろう、ということで試してみる。

@defaults.setInteger(sender.indexOfSelectedItem,forKey:key)

これでいける。@defaultsはawakeFormNibの中で
@defaults=NSUserDefaults.standardUserDefaults

としたもの。あとは保存するときのkeyをactionを送ってくるsenderによって変えてやればいいんだけれど、senderって何よ?状態のためしばらく調べる。

いちいちコントロールに名前つけないでもいいからInterfaceBuilderって楽ね、と思ったけどこのケースだとちょいと困る。どうやって6つあるPopupButtonを見分けばいいんだ。

とりあえず動けばいい、という姿勢でいかざるを得ないので、PopupButtonごとにtagをつけてそれで見分けることにした。そんなんでこういうちょっと情けない感じのメソッドでコントロールの現在値を保存。

def changedPop(sender)
  
  case sender.tag
   when 0
    key="trans"
   when 1
    key="opt"
   when 2
    key="L_butoon_click"
   when 3
    key="L_button_D_click"
   when 4
    key="R_button_click"
   when 5
    key="R_button_D_click"
    
   else key=""
  end
  
  @defaults.setInteger(sender.indexOfSelectedItem,forKey:key) if key!=""
 
 end

なんかVBAみたいだな、と自嘲しつつ。
あとは保存した値をawakeFormNibからこんなメソッドを呼び出すことで読み取る、と。

def set_popup_botton_index
  trans_pop.selectItemAtIndex(@defaults.integerForKey("trans"))
  option_pop.selectItemAtIndex(@defaults.integerForKey("opt"))
  l_click.selectItemAtIndex(@defaults.integerForKey("L_button_click"))
  l_d_click.selectItemAtIndex(@defaults.integerForKey("L_button_D_click"))
  r_click.selectItemAtIndex(@defaults.integerForKey("R_button_click"))
  r_d_click.selectItemAtIndex(@defaults.integerForKey("R_button_D_click"))
 end

無事これでbinding相当の動作ができるので、いいとする。

次はこれをどうやってメインのコントローラーで読み込むか、ですな。
@defaults=NSUserDefaults.standardUserDefaultsって同じようにインスタンス変数作ったほうが、ことあるごとにUserDefaults読み込むより効率的だけど、UserDefaultsが変更された時にどうするか。Notification使うのがいいのかな。WarpはNotificationだったなあ。

0 件のコメント:

コメントを投稿