21

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

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

BaseViewController为子类和子类都可以访问的公共代码提供一个单一位置的最佳方法是BaseTableViewController什么?我只希望在我的代码中有一个必须处理常见任务的地方。

1)我考虑过使用具有关联引用的类别,但这里的问题是我需要自定义实现 ViewController 生命周期类,例如 viewDidLoad:,这不是一个好主意。

2)我可以完全跳过,并从 BaseViewControllerUITableViewController构建自己的,自己实现&方法,但我不太想在这里跳过苹果的控制器实现。BaseTableViewControllertableView delegatedatasource

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

这种类型的东西还有其他好的方法吗?

4

3 回答 3

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;
}

如果您想使用不同的表格视图样式,您可以提供一个通用的方法或属性来在初始化时获取表格视图样式

于 2012-07-23T10:06:38.477 回答
5

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

所以方法代码将在一个地方,并且没有多个属性声明。

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

于 2012-07-23T10:58:36.903 回答
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
于 2017-06-22T18:38:21.737 回答