NSStepperの使い方?

2006年5月4日木曜日
stepper.jpg

小遣い帳(というか、銀行口座とカードの管理ソフト。支払い口座と給料口座を別々にしているせいで、たまに口座にお金が無くて引き落としできない!とかあるから)も、徐々に出来はじめてるのですが、せっかくなので用意されてるインターフェースを使いながら、その利用法を探りつつ作る、ということをしております。

今日はNSStepperとNSTextFieldを使って、今後の支払い予定のうち、表示する範囲(2ヶ月先、3ヶ月先までなど)を決める、というのをやってみようとしたのです。ここで問題。stepperで月数を変化させたときに、当然Tableの内容も合わせて変わって欲しいわけですが、それをするにはどうしたらいいのか、ということ。NSStepperでNSTextFieldに数字(1〜12)を表示させるところまでは非常に簡単だったのです。StepperからTextFieldに線を繋げて、takeIntValueと接続すればいいだけ。でもこれじゃ数字を変えたときにTableを変える、ということが出来なくて・・・controlTextDidChangeとか使うのかな〜と思ったのですが、結局分からず。

で、いろいろ検索するうち、こういう解決方法を載せてる人がいました(元はObjective-C用に書かれており、言語は英語なので、適当に訳してあります)。

1. stepperとtextfieldを作成し、Controllerのoutletにmystepper、mytextfieldを作成してそれぞれ接続
2. Controllerに変化したときに起動させるaction(たとえばchange_rangeとする)を作成し、stepper, textfield両方から接続。
3. Controllerに以下のようにコードを記入



def change_range(sender)
value = sender.intValue.to_i
@mystepper.setIntValue(value)
@mytextfield.setIntValue(value)
(ここにtableを表示するためのコードを書く)
end



とりあえず実装は出来たのですが、もっと良い方法はあるのでしょうか。

2 コメント:

  • Cocoa Bindingsを使うのがよいかと。
    --コード(Controllerクラス)--
    (1)Controllerにも値を持たせるための値(たとえば@duration)を定義
    kvc_accessor :duration
    (2)値が変更されたときの処理をメソッドduration=をオーバーライドして書く
    def duration=(value)
    @duration = value.to_i
    # テーブルの表示内容を変更
    end
    (3)初期値があるならawakeFromNibでself.duration=3などしてください
    --Interface Builder--
    (1)パレットにNSObjectControllerをドラッグ&ドロップしてインスタンス化。アウトレットcontentにControllerを接続
    (2)NSTextFieldのBindingsでvalueにNSObjectControllerのdurationにバインディング
    (3)NSStepperについても(2)と同じようにバインディング
    ・アクションは使わないのでconnectしなくていいです
    ・他の処理にもよりますが、outletもいらなくなるかもしれません

  • > kimurawさん
    いつもありがとうございます。
    やはりBindingですね・・・恐らくそういう方法があるのではとは思ってましたが、実はまだBindingが理解できておりません(T_T)。作っていただいたレシピを解読して、少し勉強します。

  • コメントを投稿