我将扩展@ericleaf 关于使用协议和子类的评论。听起来您在问以下问题:
如何创建一个可重用的通用类,在 UIViewController 子类中呈现视图?
一个很好的方法是在你的泛型类中定义一个协议,并让你的视图控制器子类支持这个协议。该协议为您的自定义类定义了一个与之通信的接口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;
}