プロトコルとサブクラスの使用に関する @ericleaf のコメントを詳しく説明します。次のように尋ねているようです。
UIViewController サブクラス内でビューを表示する、再利用可能な汎用クラスを作成するにはどうすればよいですか?
これを行うための優れた方法は、ジェネリック クラスでプロトコルを定義し、View Controller サブクラスでこのプロトコルをサポートすることです。プロトコルは、カスタム クラスがそのdelegate
、この場合はUIViewController
サブクラスと通信するためのインターフェイスを定義します。プロトコル以外に、オブジェクトは互いの実装について何も知る必要はありません。
カスタム オブジェクトがデリゲート内でビューを表示できるようにするために必要な情報はすべて、プロトコル メソッドを介して渡されます。プロトコルの詳細は、ニーズに基づいて自由に決めることができます。カスタムオブジェクトでデリゲートに情報を「尋ねる」ことができます (たとえば、どのビューにサブビューを配置する必要がありますか?)、またはプロトコルでデリゲートに情報を提供し、デリゲートに処理させることができます (たとえば、ここにサブビューがあります)。好きな場所に置くことができます)。
SO や他の場所で利用できるプロトコルに関する優れたドキュメントがたくさんあります。これはすでに十分に長いので、例をかなり単純にしました。
プロトコル定義を含むカスタム クラス .h ファイル
// my custom class that adds adds a view to a view controller that supports it's protocol
// forward class definition for the protocol
@class MyAwesomeObject;
@protocol MyAweseomeObjectDelegate <NSObject>
- (UIView *)viewForMyAwesomeObject:(MyAwesomeObject *)awesomeObject;
@end
// this could be defined such that the delegate *must* be a UIViewController. I've left it generic.
@interface MyAwesomeClassObject : NSObject
@property (nonatomic, weak) id <MyAwesomeObjectDelegate> delegate;
@end
カスタム クラス .m ファイル
// MyAwesomeObject.m
#import "MyAwesomeObject.h"
@implementation MyAwesomeObject
// this is a dumb example, but shows how to get the view from the delegate
// and add a subview to it
- (void)presentViewInDelegate
{
UIView *containingView = [self.delegate viewForMyAwesomeObject:self];
if (containingView) {
UIView *subview = [[UIView alloc] initWithFrame:containingView.bounds];
subview.backgroundColor = [UIColor redColor];
subview.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[containingView addSubview:subview];
}
}
カスタム オブジェクトを使用した MyViewController .h
// MyViewController.h
@import "MyAwesomeObject.h"
@interface MyViewController : UIViewController <MyAwesomeObjectDelegate>
@property (nonatomic, strong) MyAwesomeObject *awesomeObject;
@end
カスタム オブジェクトを使用した MyViewController .m
// MyViewController.m
@import "MyViewController.h"
@implementation MyViewController
- (void)init
{
self = [super init];
if (self) {
_awesomeObject = [[MyAwesomeObject alloc] init];
_awesomeObject.delegate = self;
}
return self;
}
// MyAwesomeObjectDelegate
- (UIView *)viewForMyAwesomeObject:(MyAwesomeObject *)awesomeObject
{
return self.view;
}