在这种情况下我应该使用继承吗?

时间:2014-10-29 17:31:35

标签: ios objective-c

我需要将这段代码添加到许多自定义视图控制器中,其中一些从UITableViewController继承而其他视图从UIViewController继承:

self.backButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 30, 40, 40)];
UIImage *image = [UIImage imageNamed:@"backButton.png"];
[self.backButton setBackgroundImage:image forState:UIControlStateNormal];
[self.view addSubview:self.backButton];
[self.backButton addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];

- (void)backButtonPressed{
    [self.navigationController popViewControllerAnimated:YES];
}

我的问题是:在我的多个视图控制器中提供这段代码的最佳方法是什么。遗产?如果是这样,我怎样才能在从不同类继承的视图控制器中拥有它?

2 个答案:

答案 0 :(得分:0)

我倾向于使用两个子类继承(一个用于UITableViewController,一个用于UIViewController)。这意味着复制代码一次,但这比多次好。其他任何东西都有点混乱(混合+本地类的类别)。

答案 1 :(得分:0)

我会通过将代码抽象为辅助对象来实现。这样你就可以灵活地调用什么类型的对象(UIViewController,UITableViewController,其他任何东西)来调用它。

ButtonHelper.m可能会实现以下内容:

-(UIButton *)backButtonForViewController:(UIViewController *)viewController
{
    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 30, 40, 40)];
    UIImage *image = [UIImage imageNamed:@"backButton.png"];
    [backButton setBackgroundImage:image forState:UIControlStateNormal];
    [viewController.view addSubview:backButton];
    [backButton addTarget:viewController action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    return backButton;
}

如果您喜欢它们,它可以是静态方法,或者您可以在原始类中创建ButtonHelper的实例。然后打电话者可以说:

self.backButton = [ButtonHelper backButtonForViewController:self];

如果您愿意,也可以传递尺寸指标或图像,而不是使用硬编码的字符串或数字。