17

我目前正在重构几个共享一些IBOutlets 和IBAction方法的视图控制器。我将出口声明和IBAction方法移到超类中,将它们从子类中删除。

现在,当我打开 Interface Builder 时,我发现我看不到超类中声明的出口或动作。连接仍然存在,因为我在重构之前将它们连接起来,但它们是灰色的。(重要的是要注意连接也可以工作,因为我的操作会在按下按钮时触发,并且我的插座已正确修改。)

问题是,我怎样才能让界面构建器识别超类的出口?这可能吗,如果没有,你们都推荐什么?

(只是为了好玩,这是我的超类头文件:)

@interface TFMainViewController : UIViewController {
    UIImageView *logoImage, *thinkfunImage;
    UIButton *buyFullButton;        
}

@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage;
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton;

-(IBAction) buyFullVersion;

@end

编辑:如果有人想知道,我正在使用 Xcode 和 IB 3.2.5,以及 iOS 4.2 SDK。

4

10 回答 10

23

直到大约一个小时前,我才意识到甚至可以在界面生成器中连接到超类。由于这是我能找到的关于如何做到这一点的唯一问题,我会添加我的答案,即使这个问题很老。我的回答是关于 Xcode 4,而不是 Xcode 3。

据我所知,您无法使用助手编辑器连接到超类中的插座,但您可以通过单击 IB 中的“文件所有者”来完成。这应该会显示 Utilities->Connections Inspector 中的所有插座。然后,您可以 Ctrl+单击检查器中的插座(单击“+”号),然后将其拖到您在 IB 中的视图中。

于 2012-11-06T06:04:32.540 回答
16

IBOutlet .. 问题的解决方案是在身份检查器中将类类型更改为基类

在此处输入图像描述

使用 Control + 拖放进行连接

在此处输入图像描述

改回子类

在此处输入图像描述

这对我有用

顺便说一句:我使用 Xcode 6

于 2014-10-13T11:40:18.850 回答
3

IB 应该能够看到超类的出口,我已经这样做了很多次,没有任何问题。你确定你正确地导入了超类(使用#import而不是@class)?IB 需要某种方式来追溯超类。

于 2010-12-13T18:19:31.743 回答
3

在身份检查器中的超类和子类之间切换允许您跨类连接您的插座。我发现的唯一问题是当您尝试使用 UITableViewCell 及其子类执行此操作时。我想将默认的 textLabel 和 detailTextLabel 实例重新分配给我在 Interface Builder 中创建的标签。解决方法是创建替代标签,然后覆盖 getter 以改为指向这些标签。

于 2013-02-28T13:07:14.320 回答
0

我很确定 IB 只查看您用来查找网点的实际类,而不是超类。我认为最简单的解决方案是将实例变量声明留在超类中,但@property在每个子类中重复这些行。

于 2010-12-13T18:11:17.597 回答
0

我在 XCode 3.2.6 中这样做。我从连接到一个类的插座开始,然后创建一个带有额外插座的子类。当我将 File's Owner 类更改为子类时,IB 将超类插座显示为灰色。我将 File's Owner 切换到超类,然后切换回子类,现在所有插座都没有显示为灰色。

于 2013-02-01T21:16:19.463 回答
0

最简单的方法:为您的子类创建接口和实现文件!
完美的例子:Juggleware很棒的 UIButton 的ShadowButton 子类

确保在您的项目中创建 .h 和 .m 文件。注意:根本不需要#import头文件,因为这只是 UIButton 的一个类实例

界面生成器中:

  1. 选择要连接的元素。
  2. 转到实用程序->身份检查器
  3. 将类更改为您的子类(或超类)。注意:您可能必须输入您的子类名称并按 ENTER。

你完成了!

即使您已在头文件中将基本类(UIButton)声明为 IBOutlet,如下所示......

// YourViewController.h

@interface YourViewController : UIViewController {

IBOutlet UIButton *mybutton;
}

...您在 Interface Builder (ShadowButton) 中设置的类将覆盖它,因为它位于视图层中。

这种方法最好的部分是您的代码没有任何混乱的依赖问题。

于 2013-02-25T04:30:24.840 回答
0

在我目前正在工作的项目中,我们有BaseViewController一个UIScrollViewasIBOutlet并处理键盘出现/消失事件并相应地滑动内容。起初,我无法连接到那个IBOutlet,而是解决了这样的问题,这类似于 Sosily 的回答:

  • BaseViewController有一个IBOutlet,叫contentScrollView。我可以看到 5 个以前连接的网点,它们UIScrollViews在 other 上UIViewControllers,由以前参与该项目的人创建

  • 我试图将我的连接UIScrollViewcontentScrollView. 虽然 myUIViewController是 的子类BaseViewController,但我无法连接它。

  • 我试图连接已经连接UIScrollViewscontentScrollView. 虽然都是UIViewControllers的子类BaseViewController,但我也无法再次连接它们。于是,我开始寻找诀窍。

  • 我自己创建了相同contentScrollView IBOutletUIViewController,将其连接scrollView到我自己的contentScrollView插座并删除了我刚刚创建的插座。

  • 现在 scrollView 连接contentScrollView到文件的所有者,但唯一contentScrollView属于BaseViewController. 测试并验证正确处理了键盘事件。

于 2015-09-18T07:49:40.877 回答
0

我在超类中遇到了类似的问题,但这是由于 Xcode (8.2) 中的一个错误,其中 Interface Builder 不会在连接检查器中显示插座,如果这些插座已使用_Nullable类型注释声明以实现 Swift 兼容性。

nullable在@property 的括号内使用似乎可以解决该问题。

这个 Xcode 错误似乎会影响任何类(即不仅仅是超类)中的插座。

于 2017-01-12T03:17:03.067 回答
0

我遇到了同样的问题,事实证明这是因为在超类中我将 IBOutlets 声明为“_Nullable”。例子:

@property (nonatomic, strong)   IBOutlet UITableView *_Nullable mySuperTableView;

当我删除 _Nullable 时,突然 IBOutlets 重新出现在 IB 中,一切都恢复正常了。(我只将它们设置为 _Nullable 因为 Xcode 抱怨“指针缺少可空性类型说明符”......(不知道为什么)。)

于 2017-01-14T00:56:36.323 回答