在扩展中定义 IBOutlet 属性

Posted

技术标签:

【中文标题】在扩展中定义 IBOutlet 属性【英文标题】:Defining IBOutlet attributes in extension 【发布时间】:2014-07-03 17:03:54 【问题描述】:

我有一个视图控制器开始变得太大,所以我决定将所有按钮功能移动到一个单独的扩展中。

//MyViewController.h
@interface MyViewController : UIViewController

@end

//MyViewController+Buttons.h
@interface MyViewController (Buttons)

- (void)adjustButtons;

@end

//MyViewController+Buttons.m
@interface MyViewController ()



@property (weak, nonatomic) IBOutlet UIButton *myButton;

@end

@implementation MyViewController(Buttons)

@end

界面生成器允许我将按钮绑定到插座,但是当我运行应用程序时,我收到以下异常:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<MyViewController 0x12e501a70> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key myButton

我知道应该可以在视图控制器的扩展中定义插座。我做错了什么?

【问题讨论】:

您也可以将您的插座放在 .m 文件中的类扩展名中。这样你就没有头文件中可用的所有内容,并且你的代码看起来更干净。 【参考方案1】:

您正在声明一个接口,但您没有提供一个实现。 (如果您将 IBOutlet 更改为 ivar 而不是属性,则会收到链接器错误而不是运行时错误。)

为了自动合成属性和 ivar,其声明需要在其编译单元(通常为“MyViewController.m”)中可见。

在您的情况下,将 @interface MyViewController() 声明移至“MyViewController+Buttons.h”,并将该标头导入“MyViewController.m”

【讨论】:

以上是关于在扩展中定义 IBOutlet 属性的主要内容,如果未能解决你的问题,请参考以下文章

强 vs 弱 - 如何定义可能连接或不连接到 IBOutlet 的属性?

IBOutlet 在 IBDesignable 类中为零

未设置自定义 UIView iboutlet

swift 协议,IBOutlet 属性不能有非对象类型

未加载 CollectionView 单元格的 UIImageView IBOutlet 属性

无法更改 IBOutlet 属性的框架