【问题标题】:Connecting actions works. Connecting outlets doesn't连接动作有效。连接插座不
【发布时间】:2012-04-03 14:38:13
【问题描述】:

我有一个 XIB 文件,其中包含我的控件,已加载到 Interface Builder(Snow Leopard 上的 Xcode 4.0.2)中。

文件的所有者设置为 someClassController 类,我还(在 Interface Builder 中)添加了 someClass 的 NSObject 实例。

我已经设法链接例如在 someClassController 或 someClass 中具有操作的按钮 - 它适用于它们。

然而,每当我将一个出口链接到其中任何一个时,它都无法显示;和NSLog 报告NULL 指针。

  • 提示:我的问题可能比看起来要复杂得多,因为我的 someClass 和 someClassController 类都继承了其他类,这些类继承了其他类等等(我正在处理一个巨大的- 到混乱的代码库,我真的不知道还有什么可以帮助发布)......但是,我仍然想听听你对这种情况下可能出现的问题的看法......

【问题讨论】:

  • 你用什么方法检查你的网点是否存在?

标签: objective-c xcode cocoa xib iboutlet


【解决方案1】:

当你看到这样的问题时,几乎总是因为你有不止一个具有出口的对象。笔尖中您连接其插座的那个不是正在检查其插座的那个。

要对此进行调查,请在对象的初始化方法中添加语句,并可能在 awakeFromNib 中添加语句以记录 self 的值。

一些(或全部,或没有)对象可以在 nib 中创建,而其中一些(或全部,或没有)可以在代码中创建;后一组中的对象不会跳闸awakeFromNib,因为它们没有跳闸。

无论哪种方式,一旦你盘点了你拥有的类的哪些实例,你就可以杀死它们,直到你只剩下你想要的。

【讨论】:

  • 嗯,非常感谢您的帮助。你的方法绝对是有道理的。但是,我刚刚重新检查,只有一个 someClass 实例正在运行......(实际上,我取得了一些进展,虽然我仍然无法弄清楚发生了什么...... NSTextField 出口怎么会出现,而不是一个 NSMenu 出口?!要么这很奇怪,要么我在代码前花费的时间比我本该花的时间要多……哈哈)
  • 你介意看看这里吗:stackoverflow.com/questions/9774862/…
【解决方案2】:

添加到 Peter Hosey 的回答中,并在阅读了 other question you posted 中有关此问题的更多详细信息后,这里有一些其他因素需要考虑:

  1. 在 nib 中选择的文件所有者类在运行时被完全忽略。它只是为了设计时的便利——用于检查可用的操作和出口。
  2. 您是否有机会在-init 中找到零指针?插座连接-init 之后和-awakeFromNib 之前。他们永远不会在-init 中连接。

我正在尝试了解初始化的顺序(来自您的另一篇文章)。听起来您正在创建CTTabContents 子类的新实例,并将其传递给CTBrowserWindowController 子类的-addTabContents: 方法。然后CTBrowserWindowController 从笔尖加载你的对象。

或者,也许那是错误的。您可能正在创建 CTTabContentsController 子类的实例。然后该对象正在加载TabContents.xib

跟踪 nib 的加载位置以及当时作为文件所有者提供的对象非常重要。

另一个问题:您是使用手动释放/保留、自动引用计数还是垃圾回收?

最后,我重申在初始化方法中打印出self 指针的重要性。除了-init-awakeFromNib,尝试其他初始化方法,例如您的CTTabContents 子类'-initWithFrame:。当您在其余调试过程中发现间歇性空指针时,也打印出self 指针。你可能会看到 self 的不同值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    相关资源
    最近更新 更多