2011-07-10 33 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的对象指针。 –