【问题标题】:Cannot create outlet connections to subviews in Interface Builder (Xcode 5)无法在 Interface Builder (Xcode 5) 中创建与子视图的出口连接
【发布时间】:2013-12-16 03:15:52
【问题描述】:

我知道这似乎与其他一些问题重复,但答案对我不起作用。

  1. 我创建了一个单视图应用程序。
  2. 在情节提要中,我在主视图中添加了一个子视图。
  3. 我的主视图上有一个标签,而我的子视图上有另一个标签。
  4. 我创建了一个 UIView 类型的类并将其添加为子视图的自定义类。
  5. 我可以按住 ctrl 键将主视图上的标签拖动到主视图控制器类。但是,当我尝试将我的子视图上的标签按 ctrl 拖动到我的自定义类时,我无法建立连接。
  6. 我什至输入了属性信息并尝试手动建立连接,但无济于事。

在 Xcode 的 Interface Builder 的最新版本中发生了一些变化。有人可以告诉我我错过了什么吗?这里实际上没有代码。我只是在测试尝试将插座连接到具有自定义类的子视图。

第一张图片显示我已经设置了自定义类并添加了一个属性,但我无法建立连接。

第二张图片显示主视图标签已连接到主视图的控制器中。

第三张图片显示子视图的标签没有出口连接。

【问题讨论】:

  • 令人着迷。当您在表格视图中使用自定义单元格时,它适用,但在场景中使用自定义视图时不适用。
  • @Rob - 同意。我可以发誓它曾经工作过。也许我只是困惑。
  • @Rob - 回答问题,我会给你分数。你是对的。它应该工作。我找到了答案,我会发布详细信息,但如果我回答自己的问题,没有人会得到分数。所以按照它应该工作的方式回答它,我会填空并给你分数。 :-)

标签: ios objective-c uiview xcode5


【解决方案1】:

您可以在自定义视图子类的@interface中手动编写IBOutlet属性声明,并假设您已经在IB中定义了您的子视图的基类,那么您可以从代码中的出口圈拖动回到场景中的控件。

或者,正如您所指出的,Warren Burton 在他对另一个问题Can't Wire to Subview in IB 的回答中提出了这种技术和另一种技术。

【讨论】:

  • 是的。但它在最新版本中发生了变化。仍然非常相似,但您将按照以下步骤操作: 在情节提要或 xib 中打开主视图(包含子视图)。选择子视图。显示连接检查器。只要手动添加了插座,它们就会包含在连接检查器中。按住 Control 键单击连接检查器中的圆圈并拖动到子视图上的控件。该控件将突出显示,并在您释放时建立连接。这样可行!!! :-)
  • 我实际上在这里找到了答案:stackoverflow.com/questions/16620130/cant-wire-to-subview-in-ib,所以如果有帮助记得给问题或答案投票!!!
  • @Lucy 非常好。仅供参考,以上内容也在最新的 Xcode 中。听起来有几个变通办法,但遗憾的是,最自动化的解决方案不起作用!
  • 我刚刚在 Xcode 6.3.1 中对其进行了测试,它工作正常。但更重要的是,阻止您直接控制从容器视图中的UILabel 拖动到@interface 的错误也得到了修复,从而消除了“倒退”的需要。如果它不适合您,请仔细检查场景的基类是否设置为引用视图控制器。
  • 您先生是圣人。我只花了 30 分钟试图迅速解决这个问题。它仅适用于从代码中的出口到情节提要。我在 Xcode v7.2.1 中。
【解决方案2】:

问题与视图控制器的文件所有者有关。它可能设置为 IOViewController,因此您只能在该 .h 文件中进行属性连接。

您可以做的是为子视图创建另一个 .nib 文件并将子视图放在那里。然后在那个 .nib 文件中,使文件所有者为 IOSubview。物业连接在那里工作得很好。然后只需以编程方式将子视图添加到您的 IOViewController 中。请记住先从 bundle 中加载 nib 文件。

【讨论】:

  • Lucy 正在使用情节提要(不使用文件所有者概念)。如果使用 NIB,这将是首先检查的正确方法,但这不适用于情节提要。并且 Lucy 已经为视图控制器设置了基类(相当于设置 NIB 的文件所有者的情节提要)。
  • 有没有办法更改文件所有者?我相信曾经有,但正如我所说,最新版本的 Xcode 有一些变化。我想在子视图上使用重绘方法来正确布局内容。
  • @Lucy 故事板不存在“文件所有者”的概念。仅使用 NIB。 “文件所有者”的类比是视图控制器的基类(您已设置)。
【解决方案3】:

这就是我所做的(在 Swift 中):

  • 我创建了一个新的 ViewController(例如 class MyViewController: UIViewController {})
  • 在 StoryBoard 中,我展开了“场景”(即所有 UI 组件的树视图)并选择了“MyViewController”
  • 使用“身份检查器”我分配了“MyViewController”类(与默认的 UIViewController 相反)

之后我可以分配一个动作。

我怀疑对于 Obj-C 它是类似的过程。

【讨论】:

    【解决方案4】:

    您无需在子类中创建插座,而是在其所在的视图控制器上创建插座。您需要将子类#import 放入 IDViewController.h 并在那里创建一个插座。

    IDViewController.h

    #import "IDSubclass.h"
    ...
    @property (strong, nonatomic) IBOutlet IDSubclass *outletName;
    

    【讨论】:

    • 好的。我这样做了。我想在子视图上使用重绘方法来正确布局内容。 So-o-o-o-o-o-o,如何将子视图中的控件连接到自定义 UIView 类?
    • @Lucy:我从来没有在子类中添加插座,但你可以做的是调用 UIView 的 drawRect 方法并动态绘制你想要的任何标签。
    【解决方案5】:

    将故事板缩放到 100%。如果您缩小,例如 50%,则插座连接将无法工作。

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2021-01-20
      相关资源
      最近更新 更多