1

モデルを取得するために MagicalRecord (NSManagedObject のカテゴリ) を使用します。次に、クラス名に基づいてデータを表示する一般的なテーブル ビュー コントローラーを使用してそれらを表示します。

問題は、これらのデータを取得したいときに、次のようなものを使用することです。

Class type = NSClassFromString(modelName);
NSArray *model = [type MR_findAll];

これは、xcode が「MR_findALL のクラス メソッドを認識していません」という厄介なエラーを表示することを除いて、完全にコンパイルおよび実行されます。

エラーが消えるように、NSManagedObject への「クラス キャスト」のようなことはできますか? すべてのモデルに対して条件を定義したくありません。

4

3 に答える 3

2

問題は静的型チェックではありません。Classのようidに、静的型チェックを無効にします。

問題は別の問題です。Objective-Cでは、[... ...]構文を使用してメッセージを送信するために、コンパイラは最初にそのようなメソッドの宣言をどこかで確認している必要があります。コンパイラが宣言を必要とする理由は、コンパイラがバックグラウンドでobjc_msgSendまたは呼び出しのいずれかにメッセージディスパッチをコンパイルする必要があるためです。objc_msgSend_stretどちらがメソッドの戻りタイプに依存します。したがって、メソッドの呼び出しをコンパイルするには、メソッドのタイプ(宣言から)を知っている必要があります。

注意してください、私は「どこか」と言いました、なぜならその「どこか」はあなたがそれを使う場所とは完全に無関係である可能性があるからです。同じメッセージの宣言を含むダミープロトコルを宣言することができますが、これはどこでも使用されることはなく、宣言を持つという目的を果たします。または、それを含むカテゴリを宣言することもできます。なんでもいい。これはあなたにはかなり信じられないように思えるかもしれません。ただし、@ HotLicksのソリューションをプロトコルで使用し、キャストを削除しても、プロトコルが使用されているかどうかは重要ではないため、警告は表示されません。ここで関連するのは宣言です。

于 2012-10-09T03:07:46.250 に答える
0

を含むプロトコルを定義しますMR_findAll。呼び出しを行う前に、オブジェクトをそのプロトコルにキャストします。

[(id<FindAllProtocol>)type MR_findAll]

于 2012-10-08T16:53:12.490 に答える
-2

動的型付けである id に型変数をキャストしてみてください。

于 2012-10-08T16:16:19.323 に答える