【问题标题】:Interface Builder won't allow connections to custom UIView class?Interface Builder 不允许连接到自定义 UIView 类?
【发布时间】:2013-02-01 20:23:11
【问题描述】:

使用 Xcode 4.3.3,我无法弄清楚如何将自定义 UIView 类中的插座与在 Interface Builder 中创建的对象连接起来。

在一个 ViewController 中,我有各种按钮、滑块等,我正试图将它们组合到视图中。所以,在 IB 的那个 ViewController 中,我添加了 3 个视图。在任何给定时间,只有 1 个视图可见。

我派生了自定义 UIView 类来处理这 3 个视图中的每一个。我的视图控制器实例化了每个类。我在 IB 中选择了视图,打开了身份检查器并将类设置为我的自定义类。但是,当我尝试将连接从视图和/或其组成控件拖到自定义视图的 .h 文件时,IB 不会添加连接。

IB 允许我通过拖动到父视图控制器的 .h 文件来添加出口/操作,但不能拖动到自定义视图的 .h 文件。我想一旦我将视图的类设置为我的自定义类,我可以将视图组件的出口拖到我的自定义类而不是视图控制器中。

这个问题似乎与我的相同:how to connect UIview outlets to a custom subview 这两种解决方案(手动添加插座并在 IB 中设置视图的类)并没有改变我的行为。以下是我添加的手动插座:

customView3.h

#import <UIKit/UIKit.h>

@interface customView3 : UIView

@property (retain) IBOutlet customView3 *view3;
@property (retain) IBOutlet UISlider *slider;

@end

customView3.m

#import "customView3.h"

@implementation customView3

@synthesize view3, slider;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code
    }
    return self;
}
@end

我在这里缺少什么?为了将出口添加到我的自定义 UIView 而不是视图控制器,我还需要设置/检查什么?

【问题讨论】:

  • 膨胀。所以,我当然可以手动定义创建一个控件,比如滑块,并将其放置在我想要的位置。但是,如何以编程方式将操作(如值更改)设置为自定义类中的函数?我会设置 slider.delegate = myCustomView 吗?
  • 老实说,我不知道。我讨厌 Interface Builder,而且我很少使用它。要以编程方式添加操作,请使用UIControladdTarget:action:forControlEvents: 方法。
  • 为什么不直接使用self 而不是使用 *view3 给自己一个 IBOutlet?
  • @Thunk 你在这方面有什么进展吗?我在 XCode 4.6 中看到类似的东西,即使 clang 编译成功,IB 也不会接受我的 UIView 子类的名称(它会发出哔哔声)。
  • @trojanfoe 否定的。自从我向 Apple 提交了错误后,没有什么有用的报告。

标签: iphone ios ipad uiview iboutlet


【解决方案1】:

请注意,我今天确实做到了,但必须在派生类中手动插入/键入插座,然后我可以从头文件拖动到情节提要中的 UI 元素,但反之则不行.

【讨论】:

  • 这应该是一个认可的答案。事实上,当您在 .h/.m 中创建一个 Outlet/Action 原型并将连接从原型拖动到 IB 元素时,至少允许您创建一个连接。
  • 这对我有用。在您的文件中键入 IBOutlet,然后从文件拖到情节提要,而不是相反。
  • 完美运行。不知道为什么它不能反过来工作,这使得这个过程违反直觉。
【解决方案2】:

我在 Apple 中打开了一个错误。如果有什么有趣的事情发生,我会更新这个答案。

2013 年 10 月 4 日更新:经过大量研究,问题的根源似乎在于 IB 认为我正在尝试将对象连接到类中的属性,然后我将创建一组此类的实例,然后 IB 将无法判断哪个实例应该处理消息。因此,它不允许连接,因为我认为我正在(可能)同时连接从一个对象到跨类的多个实例的属性的多个副本。

我的观点是我只想要一个自定义 UIView 的实例,并且我应该能够告诉 IB,“不要惊慌,你只处理这个实例。”

我现在专注于一个新项目,还没有机会在 Xcode 5 中重试;但是,鉴于上述信息,我并不乐观它会在 Xcode 5 中运行。

【讨论】:

    【解决方案3】:

    您尝试做的事情当然是明智的 (IMO) 和可能的。然而,XCode 在建立与子视图中的插座的连接时非常古怪。

    我发现清理、重建和有时重新启动 XCode 往往会有所帮助,但有时它只是不起作用。在某些情况下,我通过手动创建插座并从插座拖动到控件而不是其他方式来使其工作。

    这不是很有帮助,我知道,但我只是想明确说明这是应该工作的,而当它不起作用时,这肯定是由于 XCode 中的错误。

    【讨论】:

      【解决方案4】:

      根据我的经验,您将 IBAction 和 IBOutlet 添加到 UIViewController 的子类,而不是 UIView 的子类。因此,在 MVC 模型中,您的“1” UIViewController 中包含所有这些 IBOutlets,然后您使用这些 IBOutlets 中的数据来更新您的视图。

      所以您可以在 IB 中创建 UIViews 对象,然后在代码中创建相应的类,然后将 IB 中的 UIViews 对象的类更改为您的 UIView 子类。只需将所有 IBOutlets 放入包含所有 UIView 的 UIViewController 中,从 IBOutlets 中获取您需要的值,然后将它们传递给(设置到)您的 UIView 子类。

      希望这会有所帮助。

      【讨论】:

      • 好吧,我的目标不是在一个巨大的视图控制器中拥有这么多对象的所有代码。这就是我试图不做的事情。我想将处理程序分散在单独的类中(不一定是 UIView 类,但这似乎是与 IB 最合乎逻辑的配对),按与这些控件关联的任务分组。
      【解决方案5】:

      我遇到了同样的问题并找到了解决方法:

      1) 打开助手编辑器,左侧为 customView3.xib,右侧为 customView3.h

      2) ctrl + 从customView3.xib中的UISlider拖拽到右边的customView3.h代码

      3) 将弹出一个创建新 Outlet 连接的选项。

      4) 命名连接并点击连接

      然后它将创建一个连接的 IBOutlet。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 2010-10-04
        • 2013-08-09
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        相关资源
        最近更新 更多