2011-07-10 7 views
1

私のゲームボード(GameViewControllerと呼ばれています)には、6つのSeat(xib内)がありますが、これはサブクラス化されたUIViewです(Seat.hと.m私のプロジェクトのファイル)。ゲームボードが初期化されると、これらのシートも作成されます(xibのおかげで)。座席をNSMutableArrayにロードして後で使用できるようにしたい。何らかの理由で私はそれを働かせることができません。NSMutableArrayをUIViewオブジェクトでロードできません

私のGameViewControllerヘッダーファイルに、NSMutableArray * seat;を追加しました。 @class Seatをインクルードしました。インタフェース宣言の上に。

GameViewControllerの私のawakeFromNibメソッドでは、私は座席= [[NSMutableArray arrayWithCapacity:6] retain];そのため、ゲームボードが表示されたら配列を初期化する必要があります。

次に、私のSeatヘッダーファイルには、GameViewController * controllerが含まれています。 @class GameViewControllerをインターフェイス宣言の上にインクルードしました。また、GameViewControllerのプロパティを追加して合成しました。

シートのawakeFromNibメソッドには、[controller registerSeat:self]があります。

これはGameViewControllerの中で、[seatts addObject:seat];という行を1つしか持たないメソッドを呼び出します。これは配列にシートを追加するはずです。しかし何らかの理由でこのメソッドが呼び出されることはありません。もしそうなら、私は決して伝えることはできません。私がデバッグするとき、シートがボードに追加されても、フォーカスはregisterSeatメソッドに決して行きません。私はこれがすべて意味があることを望みます。コードが必要な場合は、私はそれを提供することができます。とにかくそれをする方が簡単かもしれません。皆さんはどう思いますか?私は現時点で困っている。

メソッド宣言は次のとおりです。 - (void)registerSeat:(Seat *)seat;

GameViewController.h:

#import <UIKit/UIKit.h> 

@class Seat; 

@interface GameViewController : UIViewController { 

    NSMutableArray *seats; 

} 

- (void) registerSeat:(Seat *)seat; 

@end 

GameViewController.m

#import "GameViewController.h" 
#import "Seat.h" 

@implementation GameViewController 

- (void)awakeFromNib { 

seats = [[NSMutableArray arrayWithCapacity:6] retain]; 

} 

- (void) registerSeat:(Seat *)seat { 

    [seats addObject:seat]; 
    NSLog(@"seat has been registered"); 

} 

@end 

Seat.h:

#import <UIKit/UIKit.h> 

@class GameViewController; 

@interface Seat : UIView { 

    GameViewController *controller; 

} 

@property (nonatomic, retain) IBOutlet GameViewController *controller; 

@end 

Seat.m:

#import "Seat.h" 
#import "GameViewController.h" 

@implementation Seat 

@synthesize controller; 

- (void) awakeFromNib { 

    [controller registerSeat:self]; 

} 

@end 
+0

"何らかの理由でこのメソッドが呼び出されることはありません。もしそうであれば、決して伝えることはできません。" '[controller registerSeat:self]'メソッド呼び出しでブレークポイントを設定し、そこで停止するかどうか確認してください。その後、そこからどこに行くのか確認するためにステップスルーします。 –

+0

私はそれをして、それは実際にそこに停止します。しかし、私がそれを踏むと、フレームワークを深く掘り下げているようです。私が全く慣れていないところ。私は何度もボタンへのステップをクリックしなければならず、それはメモリアドレスのように見えるもののこのリストの下に続き、リストの終わりまではわかりません。実際には、その行で停止し、Step Intoを押すとフォーカスが実際にその行を通って}に移動し、Step Intoボタンをクリックするとそのリストが開始されます。だから、おそらくそれはその機能を呼び出すのではなく、単にそれをスキップしているだけです。 – dutsnekcirf

+0

さて、 'registerSeat'メソッドの最初の行に別のブレークポイントを入れてみてください。それがヒットしているかどうかを確認してください。実際には、最初のブレークポイントでStep Overをクリックできるはずです。また、実際に呼び出される場合は、 'registerSeat'メソッドで停止する必要があります。 –

答えて

1

ここでは、Xcode 4のIBOutletCollectionが解決するように設計されていることを説明します。あなたのNIBで、あなたのSeatビュー(これらはSeatViewと呼ばれ、BTW。Seatはビュークラスではなくモデルクラスでなければなりません)をすべて選択してください。選択したグループをGameViewControllerヘッダーにドラッグし、IBOutletCollectionをリクエストします。これは、それらをすべてランダムな配列として配線します。 (なぜ彼らはランダム配列の配列を私の目の前に置いていたのですか?それはやや狂った構造ですが、上記のこととまったく同じです)

高カフェイン音として、現在のコードが失敗するのは、controllernilのワイヤリングに失敗したことです。 Objective-Cで「何も起こらない」ときは、ほとんどあなたがnilと話しているからです。

+0

さて、コントローラの値が0x0であることがわかりました。これはnilと同じことだと思いますか? さて、明らかに、私のコントローラーの配線についてもっと知る必要があります。私はこれがやるべきだったと思った。メモリにすでに存在していてもコントローラの新しいインスタンスを作成するはずですか? GameViewControllerがnibから目を覚ますとインスタンス化されませんか?私はすべてのことについてスーパーが混乱してきている。メモリに既に存在するコントローラの同じインスタンスを使用していることを確認するにはどうすればよいですか? – dutsnekcirf

+0

正しい。 'nil'は0へのオブジェクトポインタです。 –

関連する問題