0

我有几个子类UIViewController,我想使用一个类别来为它们提供几种方法。问题是我只希望我的类而不是UIViewController具有该类别方法的基础。

说我有:

PanelAViewController
PanelBViewController
...

我想实现并响应一个类:

PanelAnimations

-(void)animateIn;
-(void)animateOut;

我可以使用协议并每次都插入方法,但它们使用相同的方法和值,那么类别不适合吗?

我只是不确定如何为这些自定义类定义类别。

4

3 回答 3

2

似乎你最好的选择是从 UIViewController 派生一个自定义类,称之为“MyUIViewControllerBase”。将您的自定义方法添加到该类,然后从中派生其余的视图控制器。不需要类别,它可以解决您的问题。

于 2012-06-02T07:21:22.807 回答
2

为什么你不考虑子类化,而不是使用类别或协议?在这里,您可以简单地创建一个定义面板动画方法的 AbstractViewController 类(继承自 UIViewController),然后从抽象类派生您自己的具体控制器(PanelAViewController、PanelBViewController 等)。

抽象类将定义方法,并最终在实现中定义一些存根(取决于您是否希望 PanelA 和 PanelB 应该调用 super 或不调用)。这取决于您要赋予抽象类的抽象程度。请参阅下面的代码示例。

有时不清楚使用协议或子类或委托机制是否更好。大多数时候边界并不明确,最终决定更多地取决于程序员的偏好,而不是“编码”的架构规则。通常,当您希望不同对象对某些任务具有共同行为时(例如:您有一组复杂的实体,其中一个实体应用作地图注释:在这种情况下,您必须简单地提供此特定实体) MKAnnotation 协议兼容性);当您想要扩展一个类而不继承它或没有给最终用户继承它的可能性时,通常使用委托。在您的情况下,我认为子类化是最合适的选择,因为所有类都严格属于同一类层次结构,



//
//  AbstractViewController.h
//

#import 

@interface AbstractViewController : UIViewController

-(void)doAnimate;
-(void)didAnimate;

@end

//
//  AbstractViewController.m
//

#import "AbstractViewController.h"

@interface AbstractViewController ()

@end

@implementation AbstractViewController


-(void)doAnimate {
    NSLog(@"Abstract do animate");
}

-(void)didAnimate {
    NSLog(@"Abstract did animate");
}

//
//  ConcreteViewController.h
//

#import "AbstractViewController.h"

@interface ConcreteViewController : AbstractViewController

@end

//
//  ConcreteViewController.m
//

#import "ConcreteViewController.h"

@interface ConcreteViewController ()

@end

@implementation ConcreteViewController


-(void)doAnimate {
    [super doAnimate];
    NSLog(@"Subclass do animate");
}

于 2012-06-02T07:27:21.027 回答
1

假设您可以控制所有自定义 ViewControllers,最简单的方法是创建一个子类NSViewController- 就像MyViewController- 并从中继承您自己的每个 ViewControllers。这样,您甚至不必为它们编写类别。您可以简单地在MyViewController.

          NSViewController
                 |
          MyViewController -- implement your shared methods here
           /           \
MyViewControllerA  MyViewControllerB
于 2012-06-02T07:24:58.710 回答