web-dev-qa-db-ja.com

バインディング/コアデータを使用する場合、「[something copyWithZone:]:認識されないセレクターがインスタンスに送信されました」

(私はこれを探すためにウェブ上で何時間も費やしたので、自己質問と自己回答、そしてほとんどのリソースは説明をせずに「最終的にそれを解決した」と言っています)

非常に単純なCoreData + Bindingsアプリケーションがありました。

  • コアデータからアイテムをプルするNSArrayController
  • それらをレンダリングするNSTableView
  • 最初のテーブルの行をクリックすると、そのアイテムの詳細が表示される別のNSTableView

上記の項目3は、次のエラーでアプリケーションのクラッシュを引き起こしていました。

[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance

そのメソッド(!)を実装し、そこにブレークポイントを置くと、AppleのNSCellクラスによって呼び出されていることがわかりました-これはあまり役に立ちませんでした:(。

30
Adam

これをトリガーするには上記のすべてが必要であることが判明し、XCodeを使用すると、100%ではないにしても、99.9%の状況で間違ったことを実行できます。

  1. Core-Dataオブジェクトできません copyWithZoneを実装します:-これによりクラッシュが発生します

  2. バインディングを使用してテーブルビューにデータが入力されると、NSArrayController内のオブジェクトのvaluesをコピーして、各列をレンダリングしようとします。

  3. ...しかし、列バインディングを完全に指定できない場合(Xcodeでは半分指定できます)、tableviewはvaluesではなくobjectsで「コピー」を試みます。 ==

バインディングのバグ:テーブル列に次の「値」があることを指定しました:

コントローラキー= "arrangedObjects"モデルキーパス=(空白)

(これはXCode4オートコンプリートのバグです。タブをすばやく離すとModelKeyPathフィールドが削除されることがあります)

バインディングの入力を終了します。例:

モデルキーパス= "値"

...そしてすべてが再び機能します。

25
Adam

同じ種類のもので同様の問題があったので、ここにも投稿したいと思います

空の定義済みオブジェクト:

不正なコード:

@property (nonatomic, copy, readwrite) MSender * sender;

参照カウントではXcodeがオブジェクトをコピーする方法を知らないため、これはコンパイルエラーをスローするはずです。代わりに、実行時に失敗します...

コードを書く:

@property (nonatomic, strong, readwrite) MSender * sender;

それが誰かを助けることを願っています。

8
GoodStuff

この解決策をありがとう、それは私を正しい方向に向けました。学習している方のためにInterfaceBuilderこの追加情報がお役に立てば幸いです。

チュートリアルを作成しているときに、誤ってText field Cell - Text CellArrayController.ObjectValueにバインドしたことが判明しました。
実際のバインディングはで発生するはずでした

Table Column > Table Cell View > Static Text - Table View Cell

それは正しかったが、その下のツリーで視覚的に(私はまだ理解していないので、IBにはText Field Cellが必要です。)私は バウンド:

Table Column > Text Field Cell - Text Cell

パスがキーのないobjectValueであったため、オブジェクト全体をコピーしようとしたのは2番目のバインディングであり、このエラーをトリガーしていました。

おそらく初心者の間違いですが、それはすべてのオブジェクトをウォークスルーしてバインディングをチェックすることを意味し、私はこれに遭遇しましたone

6
user445658

バインディングに関するあらゆる種類の問題を回避するためのヒントとして、コントローラーに次のデータを入力しながらNSManagedObjectNSDictionaryに変換できます:[object dictionaryWithValuesForKeys:[[object entity] attributeKeys]]、接続とデバッグがはるかに簡単です:-)

ちなみにポインタをありがとう!

3

マスター/詳細バインディングを実装しようとしたときに、このエラーが発生しました。部門/従業員に類似したもの。 arrayControllerをDepartmentの "selection.employees"にバインドしようとすると、次のようになります。

-[従業員copyWithZone:]:認識されないセレクターがインスタンスに送信されました

従業員の関係は、意図したとおり、多くではなく、1つに設定されていたことが判明しました。これを修正すると、すべてが順調でした。

1
Elise van Looij

誤ってこの問題に直面しました。

少し調べてみたところ、理由はNSTextField- cellオブジェクトに設定されているココアバインディングオプションが間違っていることがわかりました。

enter image description here

enter image description here

この問題は、バインディングをオフに切り替えることで修正されました。

0
Astoria

同様の問題が発生しました。これは、配列コントローラーから実際のオブジェクトではなく、ProxyObjectを呼び出すことで発生しました。

例えば:

MYEntity *entity = EntityController.selection;
NSString *property = entity.property;   // <--- causes the error

だが

MYEntity *entity = EntityController.selectedObjects firstObject]; // <--- fixes the error
NSString *property = entity.property;   
0
jtf

これは、NSTableViewDataSource関数-tableView:objectValueForTableColumn:row:からビューを返したときに取得しました。代わりに、値を返すことになっています(例:NSString*)。 (その名前を考えると驚くことではありませんが、エラーはこれを発見するのに役立ちません。私が考えていた関数はNSTableViewDelegate-tableView:viewForTableColumn:row:です。)

0
prewett