2

ビューコントローラが少し大きくなっています。私は5つのデリゲートプロトコルを実装していて、6つ目を追加しようとしていました。

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

それらをすべて実装する1つのコントローラーはばかげているように見えますが、他の場所では使用されていません。これらは独自のクラスにあるべきですか、それともビューコントローラーにあるべきですか?

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

このヒントのようにメソッドを見つけるのに非常に便利です:プラグママーク


または、デリゲートメソッドの実行内容とコードの構造に応じて、デリゲートプロトコルのメソッドのみを持つ別のオブジェクトを作成できます。

@interface Delegate <NSFetchedResultsControllerDelegate> : NSObject
@end

ABCViewControllerにivarとしてこのオブジェクトのインスタンスがあります。

于 2012-06-15T16:17:44.643 に答える