通用视图控制器基类

时间:2012-07-23 10:00:48

标签: objective-c ios uiviewcontroller

我想为我的项目创建一个BaseViewController类(继承自UIViewController),它可以充当我项目中其他视图控制器的基类。这是为了添加诸如常见进度HUD,刷新按钮和放大器之类的东西。网络更新机制,也许是一个错误对话框,可以通过每个子类等用文本进行自定义等。

至关重要的是,我希望能够将此功能添加到UIViewController子类和UITableViewController子类中,但我无法将自己插入到UITableViewController类层次结构中,因此非常有效我需要BaseUIViewControllerBaseUITableViewController,但如果我这样做,我必须实施两次更改并保持同步。

对于BaseViewController子类和BaseTableViewController子类都必须可访问的公共代码,有一个单一位置的最佳方法是什么?我只想在我的代码中找到一个我需要处理常见任务的地方。

1)我曾考虑使用associative references类别,但问题是我需要自定义ViewController生命周期类的实现,例如viewDidLoad:,这不是一个好主意。< / p>

2)我可以完全跳过UITableViewController,并从BaseViewController构建我自己的BaseTableViewController,实现tableView delegate&amp; datasource方法本身,但我不太喜欢在这里跳过苹果的控制器实现。

3)我可以从BaseViewController继承UIViewControllerBaseTableViewController继承自UITableViewController,并将自定义方法调用放入第三个文件ViewControllerBaseMethods可以从两个'Base'文件调用。可能仍然存在重复的属性,但至少方法代码可以在一个地方。

对于这种类型的事情还有其他任何好方法吗?

3 个答案:

答案 0 :(得分:8)

所有UITableViewController都提供了一个UITableView属性,将自己声明为委托和数据源,并将其视图设置为表视图

所以创建一个扩展BaseViewController的BaseTableViewController,将其声明为UITableViewDataSource和UITableViewDelegate并实现所需的方法,添加UITableView属性并实现loadView:

- (void)loadView
{
    self.tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] andStyle:UITableViewStylePlain];
    self.tableView.delegate = self;
    self.tableView.datasource = self;
    self.view = self.tableView;
}

如果要使用不同的表视图样式,可以提供一个公共方法或属性,以便在初始化时采用表视图样式

答案 1 :(得分:5)

我认为,您应该使用公共属性和函数创建协议定义,并且BaseTableViewController和BaseViewController必须采用它。在它之后,你的第三个选项听起来不错,你应该创建一个带有协议实现的文件(ViewControllerBaseMethods),该文件应该从两个'Base'文件中调用。

因此,方法代码将位于一个位置,并且没有多个属性声明。

这是解决Objective-C中缺少多重继承的方法。

答案 2 :(得分:1)

在Swift中你可以创建一个UIViewController扩展并将你的方法放在那里,这样你就可以在UIViewControllers和UITableViewControllers中使用它们。

extension UIViewController {
    var aComputedProperty: Bool {
        return true
    }

    func aMethod() {
        //do something
    }
}

这样做的缺点是您无法使用存储的属性。

var aProperty: Int? //this is not allowed in extensions