2010-12-01

次は NSNotification に取り組む - 環境設定パネルを作る #3 (MacBloggerGlass)

今回は明日の作業の予告だけ。

MacBloggerGlass の環境設定パネルについて「設定の保存にまつわる問題」で挙げた 3 つの問題は、NSTableView の選択を Cocoa Bindings でモデルと結びつける方法がわかったことですべて解決できた。明日は、本筋の環境パネルの実装に戻ることにする。

以前に挙げた「ざっくり手順」(→「表示するブログの選択 - 環境設定パネルを作る (MacBloggerGlass)」を参照)で言えば、残りは「User Defaults の値を参照するように、メインンアプリのコードを変更する」になる。

とは言っても、単純にメインウィンドウのアクション(右のスクリーンショットの Read ボタン)に組み込むことは難しくない。アクションメソッドの冒頭でテキストフィールドから読み取っている Blog ID を User Defaults から読むだけ。

今ある動作確認用の一時コードは以下のようになっている(Blog ID を入力するフィールドは削除する予定だから、以下はあくまで環境設定パネルの動作確認用)。

- (IBAction)getFeed:(id)sender
{
    blogID = [blogIdField stringValue];
    if ([blogID length] == 0) {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        blogID = [defaults objectForKey:MBGSelectedBlogID];
    }
    NSLog(@"Blog ID: %@", blogID);
    [...snip...]
}

これだけで「メインアプリのコードを変更する」ことが完了なら、もう終わっていることになる。もちろん、これだけではない。環境設定パネルで表示するブログを選択(変更)し「Save」ボタンを押したときに何が起きるべきかを考えてみよう。

ユーザは表示するブログを変更するために環境設定パネルを開く。その中でブログを変更したなら、アプリウィンドウに戻ってきたときに何を期待するだろうか? もう一度「Read」ボタンを押そうと思うだろうか? ユーザが環境設定パネルで「Save」ボタンを押したときの期待は (a) パネル内の変更が User Defaults として保存されること、(b) その変更がアプリに直ちに反映されること、の 2 つのはずだ。

そこで NSNotification の出番となる(ヒレガス本の Chapter 14 の内容)。これは、言わばアプリ内のオブジェクト間通信で、あらかじめ取り決めた名前を媒介にして、あるオブジェクトから別のオブジェクトに情報を送る仕組みだ。

MacBloggerGlass の場合で言えば、PreferenceController から saveSettings: の中で通知を送り、それを AppController が受け取ることになる。通知には任意のオブジェクトを同封できるため、新しい Blog ID を (NSString) として付ければ良い。受け取った側では、送られてきた Blog ID が表示中のものと変わっていたら、記事一覧を新たに取得する、となる。

明日は、コードの実装に加えて、関連するドキュメントも探すつもり。

関連記事

0 件のコメント:

コメントを投稿