我的UIViewControllers
(我们称之为MyViewController
)有一个抽象类,它覆盖了viewDidLoad
或viewDidDisappear
等基本方法。在这种方法中,做了一些准备工作,比如为导航栏设置颜色,或者准备条形按钮或类似的东西。
现在我想要UITableViewControllers
的这个基本行为。所以我创建了一个继承UITableViewController
的新类(让我们称之为MyTableViewController
)并从MyViewController
复制了99%的代码。
在此图中,您可以看到我当前的架构。列出的是覆盖方法,其中调用其他私有方法。同样,MyViewController
和MyTableViewController
共享99%的代码库(唯一的区别是类和超类的名称)。
由于显而易见的原因,这是废话。
是否有一个优雅的解决方案可以使MyTableViewController
成为MyViewController
和UITableViewController
的子类?
答案 0 :(得分:4)
这是一个建议,但我不知道它有多有用,因为我不知道你的代码。
您可以在UIViewcontroller类的类别中实现一堆方法。例如:
@implementation UIViewController (myCategory)
- (void)setupColors;
...
@end
由于MyViewcontroller和MyTableViewcontroller都继承自UIViewController,因此它们将继承您的方法。
你在两个实现中唯一复制的就是调用这些函数,但重复的代码会少得多。
- viewDidLoad...
{
[self setupColors];
}
如果你覆盖方法,请小心,因为你不能像继承类那样在类别上调用[super ...]
答案 1 :(得分:1)
您可以使用类别或合成来完成常用方法的共享实现。由于类别不能用于直接覆盖现有接口(例如viewDidLoad :),因此您需要将私有方法放入类别并从子类覆盖中调用它们。另一种选择是将您的共享实现放在一个单独的类(可能是单例)中,并将其实例组成MyViewController和MyTableViewController的属性,例如:
@interface MyViewController : UIViewController
@property (nonatomic, strong) MyControllerStyler *controllerStyler;
@end
@implementation MyViewController
- (void)viewDidLoad {
[super viewDidLoad];
[controllerStyler viewDidLoad];
}
...etc...
如果需要,组合类的方法可以引用控制器,例如:
@interface MyControllerStyler : NSObject
- (void)viewDidLoadInController: (UIViewController *)controller;
...etc...
虽然此类别的类别看起来非常好,但如果您的扩展程序共同代表您设计的一个有意义的单元(例如视觉样式属性的集合),那么可能会争论单独的对象(或对象)以更好地表示您的意图