[Mac]

Cannot perform operation without a managed object context / 2006-02-19 (日)

Cocoa Binding と格闘中。

そもそも私はObjective-C 書きとしてはもはや oldtype に分類されるワタクシです。K-V coding はまぁともかくとして、K-V observing すら実は慣れてない( ...だって、OpenStep 仕様にも GNUstep にもなかったもん...、NSNotification で色々頑張ってましたよ )、ゆえに CoreData はもちろん Cocoa Binding も苦手分野だったりします。 頭では分かってても、手に馴染んでないと言うべきか...。

そうも言ってられんので、いい機会だから試験勉強の気分転換がてらちびちびいじってたりします。しかし、Interface Builder の binding パネルの内容や設定方法にはなんていうか慣れない...私の直感に馴染まないというか。ああ、直感とはしょせん経験の集大成、無意識の常識基盤との整合性に過ぎない。普遍でもなければ容易に修正する事の出来るものに過ぎず、「馴染めばいい」だけの事なんだ。

とはいうものの、この「線を引かない」UI への嫌悪感は直感云々よりも WO Builder の悪夢の後遺症の気もしなくもないですが(^^;

はてさて、手元のオブジェクトEをインスタンスにして、NSArrayController の contentArray として接続、E のインスタンス変数に NSMutableArray を用意、key value coding で読み書きできるようにしました。なお、NSMutableArray の中身は plist に保存してます。こーすると手軽に色々確認できるので。 さらに、NSTableView の各テーブルをを NSArrayController と接続してます。

plist の中身は

E -> NSArrayController > NSTableView
という流れで K-V Coding でデータが流れて表示されます。NSTableView でデータを編集すると今度は
NSTableView -> NSArrayController -> E

いう順で K-V observing により通知され、値が更新されます。

また、UI にあるボタンから NSArrayController の add: アウトレットに接続、新規項目の追加も出来るようにしました。

そう、データの編集と新規作成はいいんだ。しかし、NSArrayController の remove: アウトレットにボタンを接続、現在選択されている項目の削除を試すと、何故か冷害が発生、ログに

Cannot perform operation without a managed object context

と記録されます。一応削除自体は出来ているので、UI から削除をする分は動いていると言えば動いている。けど、他のロジックから NSArrayController の remove: メソッドを叩くとそこで Exception が励起されるから実行が中断されてしまう。

いや、remove: とか removeArrangedObjectAtIndex: とかの前後を NS_DURING - NS_HANDLER でくくって無視させれば逃げれると言えば逃げれるけどさ、何で削除でだけ、このエラーが出るかが分からないってのが、なぁ。

仕方ないので色々調べてたけど決定的情報には巡り会えず。けど、藤棚工房さんとこの Cocoa Bindingの勉強になるサンプルをみてサンプルと比較する事を思い立ち、Bookmarks の binding 設定と見比べてようやく気がつきました。そう、binding の設定の「Delete object on remove」フラグを外さないといけなかったのですよ。

...やられた...orz...。

...