2011-06-03 58 views
7

为什么IBOutlet(连接的)可能是nil的原因是什么?IBOutlet无效的原因

我有一个在可能的应用程序,总是nil,即使我从零开始重新创建(声明和控制)。

回答

4

这可能是你的笔尖混乱了,但我发现一个常见的原因是有两个实例,你认为你只有一个实例,而你在代码中使用的实例不是你连接的实例。

+1

“两个实例”场景的一个常见原因是在代码中创建控制器实例,并在加载笔尖时使其成为笔尖的所有者。然后,在IB中创建另一个控制器实例并连接到该网点,而不是“文件所有者”。 – 2011-06-03 12:23:20

+0

或者,在另一个笔尖中创建一个实例,然后将其中一个实例挂钩,并发现该插口在另一个笔记本中为“nil”。另一种可能性是,您只创建了一次对象,但尚未加载它将是所有者的笔尖。 – 2011-06-04 01:45:35

2

如果您还定义了创建视图的loadView方法,可以根据初始化方法进行。如果使用alloc-init对它初始化,并且nib名称与类名称不同,那么可以有一个情况,即插座为零。但查克的回答似乎更合理的假设。

0

一种可能性: 假设IBOutlet中的容器是一个像一个功能一个单独的对象:

+ (singletonObject*) sharedInstance { 
    if(!gGlobalSingletonPointer) { 
     gGlobalSingletonPointer = [[singletonObject alloc] init]; 
    } 

    return gGlobalSingletonPointer; 
} 

你“按需”创建单独的对象,如果它不存在。 您可以在该函数中为其创建一个全局指针。

如果您还在InterfaceBuilder中实例化了这样一个对象,并连接其插座,则将创建该对象而不调用 sharedInstance。如果您随后调用sharedInstance,则会创建一个新的对象(sans IBOutlet连接)。

解决的办法是更新singletonObject的init或awakeFromNib函数中的全局指针。

0

您使用的是UINavigationController吗?
如果是这样,请在IB中打开MainWindow.xib,并确保在属性检查器中正确设置了根控制器的nib名称。

为什么不能正确设置?一个原因是'重命名'重构不会更新这个,然后内部将不会找到用于连接您的用户界面的笔尖。或者你自己重新命名了笔尖,并没有更新这个字段。

1

我刚刚被刺住的一个原因是:如果nib文件由于某种原因未被包含在目标资源文件中(例如,当您将目标添加到项目时没有选中目标),Xcode不会引发错误但是这个笔尖的所有插口都将是空的...

相关问题