0

ユーザーにテーブルを表示する非常に単純なビューを設定しようとしています。このテーブルは、CoreDataからレコードを取得するために使用する配列コントローラーに接続されています。何らかの理由で、「managedObjectContext」アウトレットをアプリ内の他のものに接続できないようです。プロジェクトを作成したときに、必要なMOCを返すプロパティがアプリデリゲートに生成されましたが、宣言の前に「IBOutlet」を追加しても、InterfaceBuilderに接続できません。下の画像は、両端で使用可能な接続を示しています。

http://yada.im/uploads/image/screenshot/1108/7efebc90ca7187a537da9ae003dd5f3e.png

私はここでいくつかの簡単なステップを見逃していると確信していますが、これをより簡単に接続できるようにするために、どのグルーコードを書くべきかわかりません。参考までに、コントローラーのmocアウトレットから考えられるすべてのソースに線をドラッグしてみて、「File'sOwner」クラスをアプリケーションのクラスに変更しました。ここで困惑!

4

2 に答える 2

2

通常、XCodeが提供するテンプレートには、managedObjectContextが付属していAppDelegateます。managedObjectContextアレイコントローラの参照をmanagedObjectContextinにバインドする必要がありAppDelegateます。

このためにはAppDelegate、xib内のオブジェクトを作成する必要があります。つまり、オブジェクトがまだ存在しない場合です。(オブジェクトライブラリからオブジェクトプレースホルダーをドラッグし、そのクラスをとして作成しますAppDelegate

これによりAppDelegate、そのxib内のバインディングが表示されます。

次のステップは、実際にmanagedObjectContextをバインドすることです。アレイコントローラーを選択し、バインディングインスペクターに移動します。パラメータセクションで、ドロップダウンから[App Delegate]を選択し、[Bindto]をオンにします。[モデルキーパス]フィールドに。を入力しself.managedObjectContextます。これで、接続インスペクターにも接続が表示されます。

更新: 新しいAppDelegateオブジェクトを作成するプロセスは、メインのnibファイルにまだ存在していない場合にのみ実行されます(ただし、生成されたスタブには常にAppDelegateメインのnibファイルにオブジェクトがあります)。

非メインnibファイルの場合、上記のアプローチに従うと、デリゲートAppDelegateではない新しいオブジェクトが作成されます。NSApplication'sこれは、各ペン先で提供されるアプリケーションオブジェクトプロキシのデリゲートアウトレットを接続することで解決できますが、AppDelegateオブジェクトは同じではありません。

その結果、2つの異なるmanagedObjectContextが同じストアと通信します。各ステップで変更を保存すると、これは正しく機能するように見えるかもしれませんが、これは私たちが望んでいることではありません。

適切なAppDelegateオブジェクト、つまりメインのnibファイルで使用されているオブジェクトを取得するには、次のようにします 。-新しいオブジェクトを作成する代わりに、アプリケーションを介してアレイコントローラーのをデリゲートに直接AppDelegateバインドします。managedObjectContextつまり、バインドするオブジェクトはアプリケーションオブジェクトになり、使用されるキーパスはになりますself.delegate.managedObjectContext

于 2012-08-14T12:37:45.650 に答える
0

エンティティのオブジェクトを追加する方法は、実装する特定のロジックによって異なります。一般的で簡単な解決策は、テーブルに対して行ったよう に、入力用のフィールドを配列コントローラーにバインドしてから、配列コントローラーのメソッドをシート内のボタンに接続することです。

もう1つのオプションは、NSArrayControllerをサブクラス化し、スーパークラスメソッドadd:を呼び出す前に(スライドシートを開くために)コードを記述するなどのスーパークラスメソッドをオーバーライドすること[super add:sender]です。NSArrayControllerのこのサブクラスをxibのアレイコントローラーのクラスとして指定することを忘れないでください。

于 2012-08-15T08:49:36.277 に答える