由于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
文件中?
答案 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.h
和privateView
,这些出口仍可在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文档。