如何在通用 UIViewController - 通用应用程序中仅为 iPAD 创建 IBOutlet

Posted

技术标签:

【中文标题】如何在通用 UIViewController - 通用应用程序中仅为 iPAD 创建 IBOutlet【英文标题】:How to create IBOutlet only for iPAD in a common UIViewController - Universal App 【发布时间】:2011-11-01 13:23:09 【问题描述】:

我有 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]

在我的控制器的每个地方?

【问题讨论】:

【参考方案1】:

您的代码是正确的。该出口应该保留nil,因此向其发送release 消息应该是无害的。我建议您检查此插座的设置位置并解决问题的原因,而不是解决该错误。你确定你没有在 iPhone 笔尖上连接任何东西吗?

【讨论】:

就是这样,我没有设置插座,它只连接在iPAD Xib内部。 iPhone内部没有这样的插座。虽然有一个名称相似的出口,但我认为这里没有命名问题。奇怪的是,起初我在 iPhone 上看到它是 nil,但后来由于某种原因它得到了奇怪的值。我检查了内存泄漏,但没有找到。 缩小代码中设置此变量的位置。如果您有一个未使用的与此相对应的属性,请将其删除。对变量名称运行项目范围的搜索。在loadView 上设置断点,以确保您不会在任何时候意外加载 iPad 笔尖。【参考方案2】:

您必须在运行时检查设备并处理插座,然后如果您想要单独的插座。

如果我在不同设备上创建具有不同控件的应用程序,我倾向于以编程方式创建它们以避免此类连接问题。

【讨论】:

【参考方案3】:

在你的 dealloc 中避免在 iPhone 上崩溃,并像往常一样在你的 iPad xib 中连接 IBOutlet:

-(void) dealloc

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
        [outletOnlyForIpad release]
    

【讨论】:

【参考方案4】:

初始化类时,所有实例变量都会自动初始化为零。因此这相当于添加:

outletOnlyForIpad = nil;

到您的init 方法。

当为 iPad 而不是 iPhone 加载视图时,nil 值将被覆盖(除非您有其他代码设置它)。但是,您的 [outletOnlyForIpad release] 崩溃表明此时 outletOnlyForIpad 不是 nil,这意味着 something 给了它一个值。你需要找出这个东西是什么——它可能是你的界面构建器文件。

【讨论】:

这不是必需的。在 Objective-C 中,实例变量自动初始化为0(相当于nil)。 我知道 - 这没有什么害处,而且它可以帮助他看到创建类时肯定是nil,从而帮助他追踪它被设置为非-nil 值。此外,如果他继续用 C 或其他不memset() 分配对象的语言编写,初始化变量是一个好习惯。 如果没有任何目的,冗余代码本质上是有害的。这是需要阅读和理解的额外代码。错误可能会导致不必要的副作用。新手可以确信这是必要的,并编写大量他们不需要的代码。 用一种语言编写代码就像用另一种语言编写代码一般不是一个好主意,参见。 “任何语言的 Fortran”。 最后,如果变量在某处被设置为其他值,它将在 init 被调用之后。

以上是关于如何在通用 UIViewController - 通用应用程序中仅为 iPAD 创建 IBOutlet的主要内容,如果未能解决你的问题,请参考以下文章

如何将通用链接连接到 UIViewController?

通用 UIViewController

iOS 7 通用后台 UIViewController

如何继承 UIViewController 的子类

有没有一种通用的方法来通知所有在 UIViewController 级别开始和移动的触摸?

UIViewController - 加载缓慢