我有2个xib,一个用于iPad,一个用于iPhone。 但是,目前我只有一个视图控制器用于那些适用于iPhone和iPad的2个xib。
在我的iPad Xib中,我有一个不属于iPhone xib的IBOutlet。 我该如何定义那个插座? 我注意到如果我把deallc方法放在里面,就像这样:
-(void) dealloc
{
[outletOnlyForIpad release]
}
该应用程序在iPhone上崩溃。显然因为它没有在iPhone上实例化。 (我希望它会保持零,但事实并非如此)
我没有找到任何可以使用的预处理器宏,因此我可以仅为iPad声明该Outlet。 唯一的方法是检查runTime,如:
isIpad()
[outletOnlyForIpad SomeMethodOnTheOutlet]
在我的控制器的每个地方?
答案 0 :(得分:0)
如果您需要单独的插座,则必须在运行时检查设备并处理插座。
如果我在不同设备上创建具有不同控件的应用程序,我倾向于以编程方式创建它们以避免此类连接问题。
答案 1 :(得分:0)
您的代码是正确的。该出口应该保持nil
,因此发送release
消息应该是无害的。我建议您检查此插座的位置并确定问题的原因,而不是解决错误。你确定你没有在iPhone笔尖连接任何东西吗?
答案 2 :(得分:0)
在您的dealloc中以避免iPhone崩溃,并像往常一样在iPad xib中连接IBOutlet:
-(void) dealloc
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[outletOnlyForIpad release]
}
}
答案 3 :(得分:-1)
初始化类时,所有实例变量都会自动初始化为零。因此,这相当于添加:
outletOnlyForIpad = nil;
使用init
方法。
当为iPad加载视图而不加载iPhone时,此nil
值将被覆盖(除非您有其他设置它的代码)。但是,[outletOnlyForIpad release]
崩溃表明此时outletOnlyForIpad
不是nil
,这意味着某事已经为其提供了值。你需要找出这个东西是什么 - 它可能是你的界面构建器文件。