将委托方法放入一个类别中

时间:2011-11-04 20:15:27

标签: objective-c ios coding-style delegates split

我开发了一些应用程序'到现在为止。现在我正在写一个新的,在这个项目中我想保持代码非常干净,所以很容易找到方法。
我想从 UIViewControllers 开始,其视图 UITableView 作为子视图。我希望有一个名为DetailViewController的文件,用于直接属于它的所有函数。另一个名为DetailViewController+Protocols的文件应包含上述类的类别以及 UITableView 的所有这些委托方法。

有可能做这样的事吗?我想保持我的代码干净并将其拆分为多个文件。


修改

DetailViewController.h

@interface DetailViewController : UIViewController

... Some Properties

... Some Methods

@end

DetailViewController.m

#import "DetailViewController.h"

@implementation DetailViewController

... Some Synthesizes

... Some Methods

@end

DetailViewController + Protocols.h

@interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>

@end

DetailViewController + Protocols.m

@implementation DetailViewController (Protocols)

- (NSINteger)numberOfSections
{
    return ...;
}

- (NSInteger)numberOfRowsInSection:(NSInteger)section
{
    if (section == 0)
        return ...;

    return ...;
}

...

@end

然后Xcode显示一些警告,一些委托方法没有在DetailViewController中实现。我还尝试在 DetailViewController.h 中导入 DetailViewController + Protocols.h 。没有变化。
然后我试着忽略警告并看到:它有效!但为什么?如果没有这些警告,它不应该有效吗?

2 个答案:

答案 0 :(得分:9)

如果您只针对一个类使用它,则不必在另一个文件中创建完全独立的命名协议。事实上,你可能不应该因为它只是令人困惑。

如果你想保持你的主要班级.h文件干净,只需移动它:

@interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>

@end

进入@implementation

上方的主.m文件

我不明白为什么你不想在你的.h中声明你的主类实现了tableview委托和数据源协议。它们是描述性的。

答案 1 :(得分:5)

是的。关注类别唯一要记住的是,您不能在其中@synthesize属性。在类别中添加ivars也更加困难。

有关详情,请参阅this