0

了解しました。コードに問題が発生しています。私が行ったことは、サブクラス化されたUIButtonであるため、コードに関連する情報をさらに提供できます。私はボタンを作成することができました、そしてそれらは素晴らしい働きをします。カピシェ。

ただし、サブクラスに保持させたいものの1つは、NSMangedObjectへの参照です。ヘッダーファイルに次のコードがあります。

@interface ButtonSubclass : UIButton {
    NSManagedObjectContext *context;
    NSManagedObject *player;
}

@property (nonatomic, retain) NSManagedObject *player;
@property (nonatomic, retain) NSManagedObjectContext *context;

- (id)initWithFrame:(CGRect)frame andTitle:(NSString*)title;
//- (void)setPlayer:(NSManagedObject *)aPlayer;

@end

ご覧のとおり、保持したいNSMangedobject(およびContext)へのインスタンス変数があります。しかし、私の一生の間、そのNSManagedObjectを保持することはできません。実装ファイルで両方の@synthesizeメソッドを実行します。

@synthesize context;
@synthesize player;

だから私は何が間違っているのかわかりません。これが私のボタンの作成方法です。

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works

        playerButton.context = self.context; //works
        playerButton.player = [players objectAtIndex:i]; //FAILS

そして、オブジェクトを取得するプレーヤー配列を以前に初期化しました。もう1つの奇妙なことは、コードのこの場所に到達すると、アプリがクラッシュ(woot)し、コンソールの出力が停止することです。エラーは発生せず、アプリがクラッシュしたことを通知します。それはただ...止まります。そのため、コードがクラッシュしているというエラーが何であるかさえわかりません。さらに、「player」変数を設定しているその列に関係していることもわかりません。考えやアイデア?私はあなたの知恵が大好きです!

4

3 に答える 3

2

あなたが持っているコードが機能しないはずの特別な理由はありません。NSManageObjectインスタンスを属性として割り当てることができます。クラッシュの最も簡単な説明は、アレイの範囲外エラーです。コンソールからエラーが発生しない場合は、通常、デバッガーがクラッシュしたためです。これは通常、デバッガスタックがオーバーフローする原因となるある種の再帰があることが原因で発生します。

ただし、ボタンなどのビュー要素にデータロジックを配置することは、非常に不適切な方法です。これにより、MVCデザインパターンが完全に破られ、コードが壊れやすくなり、保守が困難になります。UI要素は「ダム」である必要があり、渡されたデータの表示方法のみを理解する必要があります。実際にデータ自体を追跡することには関与しないでください。これが、それぞれコントローラーとデータモデルの機能です。

理想的には、「プレーヤー」オブジェクトは、コントローラーが適切なUIボタンまたは他のUI要素にリンクするデータモデルによって追跡される必要があります。プレーヤーの追跡をデータモデルに入れると、設計が柔軟になり、拡張、再利用、および保守が容易になります。

于 2010-06-01T13:51:18.967 に答える
1

最初にデバッグコードを追加してみてください

ButtonSubclass *playerButton = [[ButtonSubclass alloc] initWithFrame:frame andTitle:@"20"]; //works
playerButton.context = self.context; //works
NSLog(@"total players: %d", players.count);
NSLog(@"players: %@", [players objectAtIndex:i]);
playerButton.player = [players objectAtIndex:i]; //FAILS

これはおそらくエラーを明らかにします

于 2010-06-01T13:45:32.117 に答える
0

プロパティを宣言して@synthesizeを追加するだけでは、管理対象オブジェクトのコンテキストを作成することはできません。管理対象オブジェクトコンテキストはアプリケーションデリゲートによって作成され、次のように呼び出します。

[[NSApp delegate] managedObjectContext];

プレーヤー配列をどのように初期化するかはわかりませんが、含まれていると思われるオブジェクトが含まれていないのではないかと疑っています。NSManagedObjectContextには、NSSetとwhileを返すメソッドしかありません。

[[[NSApp delegate] managedObjectModel] entities];

配列を返します。NSEntityDescriptionのインスタンスが含まれています。まず、アプリケーションのアプリケーションデリゲート(AppDelegate.m)のコードを調べて、CoreDataストアへのエントリポイントについて詳しく知ることをお勧めします。

于 2010-06-02T17:06:23.310 に答える