2

我的视图控制器对我来说有点大了。我正在实现五个委托协议,并且即将添加第六个。

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

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

4

2 回答 2

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
于 2012-06-15T16:05:31.003 回答
2

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

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

这不会使您的文件更短,但至少会清楚地分为几部分

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

#pragma mark - NSFetchedResultsControllerDelegateMethods

在这个提示中找到您的方法非常方便:Pragma mark


或者,根据您对委托方法的操作以及代码的结构,您可以拥有另一个仅具有委托协议方法的对象

@interface Delegate <NSFetchedResultsControllerDelegate> : NSObject
@end

您将在您的 ABCViewController 中有一个该对象的实例作为 ivar。

于 2012-06-15T16:17:44.643 回答