我想为我的项目创建一个BaseViewController
类(继承自UIViewController
),它可以充当我项目中其他视图控制器的基类。这是为了添加诸如常见进度HUD,刷新按钮和放大器之类的东西。网络更新机制,也许是一个错误对话框,可以通过每个子类等用文本进行自定义等。
至关重要的是,我希望能够将此功能添加到UIViewController
子类和UITableViewController
子类中,但我无法将自己插入到UITableViewController
类层次结构中,因此非常有效我需要BaseUIViewController
和BaseUITableViewController
,但如果我这样做,我必须实施两次更改并保持同步。
对于BaseViewController
子类和BaseTableViewController
子类都必须可访问的公共代码,有一个单一位置的最佳方法是什么?我只想在我的代码中找到一个我需要处理常见任务的地方。
1)我曾考虑使用associative references类别,但问题是我需要自定义ViewController生命周期类的实现,例如viewDidLoad:,这不是一个好主意。< / p>
2)我可以完全跳过UITableViewController
,并从BaseViewController构建我自己的BaseTableViewController
,实现tableView
delegate
&amp; datasource
方法本身,但我不太喜欢在这里跳过苹果的控制器实现。
3)我可以从BaseViewController
继承UIViewController
,BaseTableViewController
继承自UITableViewController
,并将自定义方法调用放入第三个文件ViewControllerBaseMethods
可以从两个'Base'文件调用。可能仍然存在重复的属性,但至少方法代码可以在一个地方。
对于这种类型的事情还有其他任何好方法吗?
答案 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