2011-07-10 34 views
1

在我的遊戲板(稱爲GameViewController)上,我有六個席位(在xib中),它們只不過是子類UIViews(所以我也有Seat.h和.m文件在我的項目中)。當遊戲板被初始化時,這些座位也被創建(感謝xib)。我想將這些席位加載到NSMutableArray中,以便稍後使用它們。出於某種原因,我無法讓它工作。無法加載UIView對象的NSMutableArray

在我的GameViewController頭文件中,我添加了NSMutableArray * seats;作爲實例變量幷包含@class Seat;接口聲明之上。我的座席= [[NSMutableArray arrayWithCapacity:6] retain];我的座席= [[NSMutableArray arrayWithCapacity:6]保留];在我的awakeFromNib方法的GameViewController。所以當遊戲板出現時應該初始化數組。

然後在我的Seat頭文件中包含了GameViewController *控制器;作爲實例變量並在接口聲明之上包含@class GameViewController。我還爲GameViewController添加併合成了一個屬性。

在座椅的awakeFromNib方法中我有[controller registerSeat:self];

這調用了我的GameViewController中只有一行的方法:[seats addObject:seat];這應該將座位添加到陣列。但由於某種原因,這個方法似乎永遠不會被調用。或者如果是這樣,我永遠不會說。當我進行調試時,即使席位被添加到板上,焦點也不會進入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,順便說一下,Seat應該是一個模型類,而不是視圖類)。將所選組拖動到您的GameViewController標題並請求IBOutletCollection。這將把它們全部作爲一個隨機排列的數組連接起來。 (爲什麼他們選擇使它成爲一個隨機排列的陣列超出了我的想象;這是一個有些瘋狂的構造,但它完全符合你在上面試圖做的事情。)

由於@highlycaffeinated音符,最可能的原因你目前的代碼失敗是你沒有連線你的controller和它的nil。 Objective-C中「什麼也沒有發生」時,幾乎總是因爲你在和nil交談。

+0

好的,是的,我看到控制器的值是0x0,我猜是和零一樣的東西嗎? 好的,所以......顯然我還需要了解更多有關連接控制器的信息。我認爲這是它應該如何完成的。我是否應該創建控制器的新實例,即使已經存在於內存中?當GameViewController從nib中喚醒時,沒有人會實例化嗎?我對這一切感到非常困惑。我如何確定我正在使用已存在於內存中的同一個控制器實例? – dutsnekcirf

+0

正確。 'nil'是一個指向0的對象指針。 –