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