【问题标题】:Put delegate methods into a category将委托方法放入一个类别
【发布时间】:2011-11-04 20:15:26
【问题描述】:

到目前为止,我开发了一些应用程序。现在我正在写一个新的,在这个项目中我希望保持代码非常干净,所以很容易找到方法。
我想从 UIViewControllers 开始,它的 view 有一个 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。没有变化。
然后我尝试忽略警告并查看:它有效!但为什么?如果没有这些警告,它不应该工作吗?

【问题讨论】:

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


    【解决方案1】:

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

    如果你想保持你的初级班的 .h 文件干净,只需移动这个:

    @interface DetailViewController (Protocols) <UITableViewDelegate, UITableViewDataSource>
    
    @end
    

    进入@implementation 上方的主 .m 文件

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

    【讨论】:

    • 这是一种避免视图控制器负担并保持轻量的方法。 Viewcontroller 通常是 MVC 架构中最大的文件,这在定义上是错误的。由于可重用性和清晰性,您应该使您的类尽可能小。我完全不同意这种令人困惑的说法。恰恰相反——非常干净,任何熟悉这种技术的人都会从分离代表中受益匪浅。顺便说一句,Swift 鼓励你使用扩展来做这件事。
    • 同意——主要是。在这些委托/数据源的特殊情况下,您将在 ViewController 和数据源之间进行紧密耦合 (1:1),或者您将为多个 View Controller 重用数据源,在这种情况下,您将结束有很多条件/开关来处理每个函数调用传入的每个表参数。在这种情况下,将它放在一个单独的文件中以显示它为多个类提供服务是有意义的,但如果一个支持类只处理一种视图控制器,则将两者放在同一个文件中意味着耦合。
    【解决方案2】:

    是的。唯一要记住的类别是您不能在其中使用@synthesize 属性。在类别中添加 ivars 也比较困难。

    有关更多信息,请参阅this

    【讨论】:

    • 我在设置测试项目时没有收到编译警告。确保 DetailViewController+Protocols.m 导入 DetailViewController+Protocols.h。还有 DetailViewController.m 导入 DetailViewController+Protocols.h.
    • 从 +props 类中的这个场景中,我包含了一个 DetailViewController_private,它包含一个带有我所有本地道具的私有接口,我将它包含在 +props 的顶部,但我无法访问 self .label 例如。我错过了哪一步,有什么明显的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多