如何在一个通用的UIViewController中为iPAD创建IBOutlet



我有两个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,这意味着某些已经给了它一个值。你需要找出这个东西是什么——它可能是你的界面构建器文件。

最新更新