我们可以将IBOutlets列入一个类别吗?

时间:2013-09-27 02:57:19

标签: ios objective-c

由于ViewController的代码太大,我想知道如何将代码拆分成多个文件。这是我遇到的问题:

// In the original .m file, there are bunch of outlets in the interface extension.
@interface aViewController()
@property (weak, nonatomic) IBOutlet UIView *contentView1;
@property (weak, nonatomic) IBOutlet UIView *contentView2;
@property (weak, nonatomic) IBOutlet UIView *contentView3;
@end

我希望根据三种不同的观点将文件拆分为3个类别。

// In category aViewController+contentView1.m file
@interface aViewController()
@property (weak, nonatomic) IBOutlet UIView *contentView1;
@end

但是,如果我删除原来的contentView1插座,则无效。

问题
为什么我必须将contentView1插座保留在原始.m文件中?

1 个答案:

答案 0 :(得分:7)

Objective-C category 不允许您向类添加其他属性,仅允许方法。因此,您无法在IBOutlet内添加其他category。类别表示类似于@interface aViewController (MyCategoryName)(注意括号内的名称)。

但是,您可以在 class extension 中添加其他属性。 class extension表示与原始类名称相同,后跟()。在您的代码示例中,引用@interface aViewController()的两行实际上都声明了class extension(而不是category),无论它们实际位于哪个header文件中。

此外,您可以跨多个不同的标头创建多个类扩展。诀窍是你需要正确导入它们。

在示例中,我们考虑一个名为ViewController的类。我们希望创建具有其他ViewController+Private.h出口的ViewController+Private2.hprivateView,这些出口仍可在ViewController.m内访问。

以下是我们如何做到这一点:

<强> ViewController.h

// Nothing special here

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
// some public properties go here
@end

<强>的ViewController + Private.h

// Note that we import the public header file
#import "ViewController.h"

@interface ViewController()
@property (nonatomic, weak) IBOutlet UIView *privateView;
@end

<强>的ViewController + Private2.h

// Note again we import the public header file
#import "ViewController.h"

@interface ViewController()
@property (nonatomic, weak) IBOutlet UIView *privateView2;
@end

<强> ViewController.m

// Here's where the magic is
// We import each of the class extensions in the implementation file
#import "ViewController.h"
#import "ViewController+Private.h"
#import "ViewController+Private2.h"

@implementation ViewController

// We can also setup a basic test to make sure it's working.
// Just also make sure your IBOutlets are actually hooked up in Interface Builder

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.privateView.backgroundColor = [UIColor redColor];
    self.privateView2.backgroundColor = [UIColor greenColor];
}

@end

这就是我们如何做到的。

为什么您的代码无效

最有可能的是,您可能混淆了#import语句。要解决这个问题,

1)确保每个class extension文件导入原始类标题(即ViewController.h

2)确保类实现(即ViewController.m)文件导入每个类扩展标头。

3)确保类标题(即ViewController.h)文件 导入任何类扩展标头。

作为参考,您还可以在Customizing Existing Classes上查看Apple文档。