0

プロジェクトの NSManagedObject を (かなり) サブクラス化しました。元のプロジェクトでは、何の努力もせずにシームレスに機能しました。

これらのファイルを新しいプロジェクトにコピーし、適切な CoreData クラスを新しいデータ モデルに手動で追加しました。

残念ながら、私には「問題」があります。何らかの理由で、問題のサブクラスのメソッドが無視されています。2 つのプロジェクト間でまったく同じコードですが、認識されないセレクターの問題が突然発生します。

NSFetchRequest *blockRequest=[[NSFetchRequest alloc] init];
NSEntityDescription *blockDesc=[NSEntityDescription entityForName:@"AdBlock" 
                                           inManagedObjectContext:context];
[blockRequest setEntity:blockDesc];

AdBlock *curBlock=[adBlocks objectAtIndex:blockIndex];

adBlocks=[context executeFetchRequest:blockRequest error:nil];

for (AdBlock *block in adBlocks) {
    [block initAdBlock];//Crashes with unrecognized selector
}

確認したところ、適切な .m ファイルがコンパイラのビルド フェーズに追加されました。コードは文字通りコピー&ペーストであり、2 つのプロジェクト間で同一です。ソースは機能しますが、宛先は機能しません。

サブクラスの型を返す必要があることをコンテキストに明示的に伝えていないことに気付きましたが、それは古いプロジェクトでは問題ではなかったのに、なぜ新しいプロジェクトで問題になるのでしょうか?

4

3 に答える 3

1

モデルを確認し、インスペクターでクラス名を変更したことを確認してください。それ以外の場合は、何があってもNSManagedObjectsとして返されます。また、クラスの再生成について心配する必要がないように、mogeneratorを使用してください。

于 2012-08-27T19:43:44.573 に答える
1

このようなことが起こったとき、私が試みることは 2 つあります。私が最初にすることは、NSManagedObject サブクラスを適切に #import したことを確認することです (必要以上にその方法を忘れてしまいます) が、あなたがコピーして貼り付けたと言ったように、それはあなたの問題ではないと思います。2 番目に試みることは、[ファイル] > [新規] > [ファイル]、[NSManagedObject サブクラス] の順に移動して、NSManagedObjects を再構築し、何かを変更した NSManagedObjects を選択することです。それが機能するかどうかを確認してください。そうではないかもしれませんが、簡単に始めることができます。

于 2012-08-22T04:05:05.747 に答える
1

この質問が古くなっていることは知っていますが、検索している人がこれを参考にするかもしれません。

NSManagedObject サブクラスに関数を追加するために、カテゴリを使用してきました。これにより、XCode コマンドを使用して、カスタム ロジックを破棄することなくクラス定義を生成できます。ロンは、選択した回答のコメントでこれについて言及しています-かなり洗練されたソリューションであることがわかったので、注意を喚起する価値があると思いました.

于 2013-09-08T23:05:12.867 に答える