-1

次のコードでは、下の行の前にある 2 つのコメントのうち、最初の行だけが機能します。

NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 
//Work but strange
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value]; 
 //Error
Event.value= [NSNumber numberWithInt:buf4[v+h]]; 

2回目のリターンとエラー

request for member 'value' in 'Event', which is of non-class type 'NSManagedObject*'
4

2 に答える 2

5

始める前に、Objective-C でコードを記述する際に従うべき規則があることを指摘しておくことが重要です。クラス名は大文字で始める必要があります: Event, NSManagedObject, MKMapView. 変数は小文字で始める必要があります: event, currentUser, myMapView.

さて、あなたの問題に。 [Event setValue:foo forKey:value]Event.value=foo(sic) は、変数値が string を含む NSString である場合を除いて、同じではありませんvalue。(つまり、NSString *value = @"value") より明確に言えば、 notfoo.bar=bazと同等です。[foo setValue:baz forKey:@"bar"][foo setValue:baz forKey:bar]

于 2010-10-11T23:08:27.990 に答える
3

表示されている問題は、連想ストレージと呼ばれるNSManagedObjectクラスの動作が原因で発生します。

連想ストレージは基本的に、一般的なNSManagedObjectを、割り当てられたエンティティのプロパティの名前をキーとするディクショナリに変換します。辞書やその他のKey-Value準拠クラスの場合と同じように、キーの値を設定してアクセスします。したがって、次のような汎用管理対象オブジェクトを使用する場合:

NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext]; 

str...データモデルで定義されたエンティティのキ​​ーを持つ汎用NSManagedObjectインスタンスを取得します。したがって、Key-Valueコーディングを使用して、汎用NSManagedObjectインスタンスに値を格納できる場合は次のようになります。

[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value];

またはより明確に次のようなもの:

[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:@"anAttributeName"];

ただし、ドット表記は別のものです。呼び出すEvent.anAttributeNameときは、NSManagedObjectのカスタムサブクラス内のメソッドを呼び出しています。これを機能させるには、名前を使用してカスタムサブクラスを生成し、それをデータモデルのエンティティにEvent割り当てる必要があります。Event

ドット表記を使用すると、次のようなメソッドを呼び出すことになります。

-(void) setAnAttributeName:(NSNumber *) aNumber{
    //some boilerplate
    [self setPrimativeValue:aNumber forKey:@"anAttributeValue"];
    // some more boilerplate
}

メソッドを自分で作成することも、@dynamicコンパイラ指令を使用して実行することもできますが、どちらの場合も、メソッドが必要です。メソッドもドット表記もありません。

Core Dataを学習しているだけの場合は、汎用のNSManagedObjectsを使用setValue:forKey:して、カスタムのNSManagedObjectサブクラスに移動するのが最適です。

于 2010-10-12T21:19:55.973 に答える