2010/02/21

CoreData NSArrayController 複数nib間での共有

今回は、Cocoaユーザ御用達のInterface builderでのTipsです。

サンプルを作ってみたので、参考までに。

(Xcode3.1.4で作成、OSX10.5SDK使用、動作は保証できないし、正しいコードかどうかは不明ですので、ご了承くだされ)



<どんな時役立つか>
CoreDataを使うときは、 NSAC(もといNSArrayController)を使って、NSAC中のそれぞれのオブジェクトの任意の値を、それぞれのGUIのテーブルなどにバインドすることが多いとおもいます。そこで、InterfaceBuilderがあれば、ちょちょっとbindして、線を繋いだり設定したりするだけで、簡単にCoreDataの恩恵に与れます。が、例えば、複数のwindowを使用するアプリの場合、xibファイル毎に各windowを管理する(のが一般的かと)ので、各xib間でNSACを共有/同期したい時があります。この時、全てコードでやると、アクセサメソッドだとか、bind設定だとか割とごちゃごちゃして、めんどくさいという事があると思います(特にmax/mspとかGUIプログラムに慣れ親しんでいる人でないですかー)。そんな時、役立ちますきっと...

ともかく、「CoreData(兼NSAC)中のデータを複数xib間で簡単に共有/同期したいときに役立つハズ」というこが言いたかっただけです。


<ポイント>
これ、同じ事考えている人(※)がいて、やり方としては、この方の説明を見れば大体わかります。が、大まかに言うと、NSApp(アプリのインスタンス)の delegateがKVC準拠であるため、NSApp.delegate以下にKVC準拠のプロパティとしてNSACを作り、 NSApp.delegate.nsac.~という感じでbindしてあげれば、それらのプロパティへのアクセスが可能になるということです。

※ この方サンプルも公開しているのですが、Xcode 10.5環境だとうまく動作しません。これは、NSACの Auto Rearrageオプションのバグらしいので、これを修正すると、動作してくれます。僕のサンプルソースではNSACのサブクラス, ArrayControllerFixで同じことをしています。受け売りですが。

なので、ポイントとしては、MainMenu.xib内でインスタンス化される二つのNSAC(厳密にはそのサブクラス) artist, songをKVC準拠にすること(ようはアクセサをもうけること)で、NSApp.delegate.~以下に続けてartist.arrangedObjects.~などとキーバリューをつなげられるようにしたことです。

サンプルソースのクラス Multi_Xib_AC_Share_AppDelegate 中アクセサ作成部:

/* Multi_Xib_AC_Share_AppDelegate.h */
@interface Multi_Xib_AC_Share_AppDelegate : NSObject {
IBOutlet id artist;
IBOutlet id song;
}
@property (assign) IBOutlet id artist, song;

/* Multi_Xib_AC_Share_AppDelegate.m */
@synthesize artist, song;


<まとめ>
これ、関係ない人にとってはどうでもいいですが、CoreData使いには結構ありがたい話と思うのですがどうなのでしょうか。。もしかしてもの凄く初歩的な事だったりして。。とりあえずupしてみました。

間違いとか指摘など、レスくださるとありがたいです。

P.S. ozaw○さんupしたおー!

2 コメント:

匿名 さんのコメント...

複数のXIBから共通のNSUserDefaultsControllerにアクセスできるかどうか調べている時に、この記事を見つけました。
サンプルのリンクが切れているようですので、再アップしていただけませんか?

Mito さんのコメント...

スミマセン。。大分遅れてしまいましたが、
githubにおいておきました。Xcode4でビルド確認済です。gitお使いでしたら、下記よりどうぞ。
https://mitolog@github.com/mitolog/Multi_Xib_AC_Share.git

About Me

自分の写真
目指せネイチャアプログラマ!Objective-C/Cocoa、web系スキルも絶賛習得中。Nature Interfaceに興味ありあり。
Powered By Blogger

Mitolog © 2008. Template by Dicas Blogger.

TOPへ