loadNibNamed加载到不同的IBOutlets?

时间:2012-06-03 19:02:55

标签: objective-c cocoa-touch interface-builder iboutlet

我有一个非常奇怪的问题,但还没有解决它。

定义了这个类:

@interface EngineViewController : UIViewController
{
}
@property (nonatomic,readonly) IBOutlet GameView* vGameView;
@property (nonatomic,readonly) IBOutlet MainMenu* vMainMenu;
@property (nonatomic,readonly) IBOutlet CountryOverlay* vCountryOverlay;
@end

在init方法中我有这段代码:

if (![[NSBundle mainBundle] loadNibNamed:@"EngineViewController" owner:self options:nil])
{
    NSLog(@"Failed to load menu nib!");
    return NO;
}

// init
[self.view addSubview:vMainMenu];

问题是,vMainMenu为nil,vGameView为0x1,MainMenu类实例分配给vCountryOverlay(而不是vMainMenu)。

是的,在Xib中,我将EngineViewController作为文件所有者,将vMainMenu插座设置为UIView(MainMenu类)+其他未设置的插座。

我不知道该尝试什么。我尝试创建一个空的xib,将文件所有者设置为EngineViewController并再次设置该vMainMenu插座。我还试图在开头添加一个新的“虚拟”插座属性。试图从应用程序的不同部分调用loadNibNamed,总是一样。

但是,当我创建一个新的,干净的项目,新的笔尖,设置所有者,做了几个出口并做了同样的工作就好了。

为什么loadNibNamed导致第一个插座设置为0x1并“偏移”其他插座,设置一个应该在当前插座的实例到下一个插座?知道该尝试什么吗?

非常感谢!!

3 个答案:

答案 0 :(得分:0)

您是否介意为您的房产尝试以下声明:

@property (nonatomic,retain) IBOutlet GameView* vGameView;
@property (nonatomic,retain) IBOutlet MainMenu* vMainMenu;
@property (nonatomic,retain) IBOutlet CountryOverlay* vCountryOverlay;

答案 1 :(得分:0)

UIViewController的默认init方法可能会做一些棘手的事情。 你应该使用

- (id) init {
   self = [self initWithNibNamed:@"EngineViewController" ....];
   if (self) { ... }
   return self;
}

答案 2 :(得分:0)

确定。问题出在(gdb)调试器中。它显示错误符号的错误数据。 数据已正确加载到IBOutlets,崩溃问题在其他地方。 非常感谢您帮助我。

在这些情况下,首先尝试使用NSLog。 :P