在扩展中定义 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 的属性?