将代表移动到他们自己的班级?

时间:2012-06-15 15:58:34

标签: objective-c design-patterns delegates

我的视图控制器对我来说有点大。我正在实施五个委托协议,并准备添加第六个。

ABCViewController : UITableViewController<NSFetchedResultsControllerDelegate,
                                          UITableViewDelegate,
                                          UITableViewDataSource,
                                          UIAlertViewDelegate,
                                          CLLocationManagerDelegate>

实现它们的一个控制器似乎都很荒谬,但它们并没有被其他任何地方使用。它们应该在自己的类中还是在视图控制器中?

2 个答案:

答案 0 :(得分:4)

您可以向ABCViewController添加类别,如下所示:

<强> 1。将ABCViewController.m中的任何声明移动到ABCViewController.h中的私有类别

// in ABCViewController.h
@interface ABCViewController : UIViewController <delegates>
// anything that's in the _public_ interface of this class.
@end

@interface ABCViewController ()
// anything that's _private_ to this class.  Anything you had defined in the .m previously
@end

<强> 2。 ABCViewController.m应该包含.h。

第3。然后在ABCViewController + SomeDelegate.h和.m

// in ABCViewController+SomeDelegate.h
@interface ABCViewController (SomeDelegateMethods)

@end

// in ABCViewController+SomeDelegate.m
#import "ABCViewController+SomeDelegate.h"
#import "ABCViewController.h"  // here's how will get access to the private implementation, like the _fetchedResultsController

@implementation ABCViewController (SomeDelegateMethods)

// yada yada

@end

答案 1 :(得分:2)

您还可以在.m文件中声明符合该协议,如下所示:

@interface ABCViewController (NSFetchedResultsControllerDelegateMethods) <NSFetchedResultsControllerDelegate>
@end
@implementation ABCViewController (NSFetchedResultsControllerDelegateMethods)
...
@end

这不会缩短您的文件,但至少会将其分成几部分

如果您使用Xcode,可以尝试这样的例子:

#pragma mark - NSFetchedResultsControllerDelegateMethods

非常方便找到您的方法,例如tip: Pragma mark


或者,根据您执行的委托方法以及代码的结构化,您可以拥有另一个只包含委托协议方法的对象

@interface Delegate <NSFetchedResultsControllerDelegate> : NSObject
@end

您将在ABCViewController中将此对象的实例作为ivar。