我使用的是Swift 2.0,我有很多具有非常相似功能的viewcontrollers:
UITableViewCell
UITableViewCell
和对象它们都足以让我想要创建一个通用的UITableViewDelegate
和UITableViewDataSource
,我可以在每个视图控制器中实例化它,只传递viewcontroller特定的信息,如
UITableViewCell
id 我正在和它斗争几天。我能够得到相当普遍的类,可以处理大部分情况。我正试图推动其处理其他几个案件。
但是,对我来说最大的问题是能够以某种方式传递一个数组到这个通用的数组,可以在这个通用类中修改(删除和插入新对象)。
问题是传递数组的快捷方式(创建它的副本)。我问过它的问题example here但是,我觉得我没有足够的灵活性来概括它。
有没有人看到解决这种概括的方法?有什么想法吗?
答案 0 :(得分:2)
我会创建一个包含您需要实现的所有UITableViewDataSource
和UITableViewDelegate
方法的超类。然后我会在您在子类中重写的超类中创建可覆盖的方法。超类在需要从委托方法获取数据等时调用这些方法。
子类从超类重写的方法示例。
// Backing array class
class MyObject {}
// Base Controller
class BaseController: UIViewController {
// Overrideable methods for subclasses providing data.
func backingArray() -> [MyObject] {
return [MyObject]()
}
func cellId() -> String {
return ""
}
}
extension BaseController: UITableViewDelegate {
// Use the methods in the same way used in the example in the data source extension.
}
extension BaseController : UITableViewDataSource {
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
// Use data from the backingArray() here.
return UITableViewCell()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return backingArray().count
}
}
// Sub classes
class FirstSubController : BaseController {
override func backingArray() -> [MyObject] {
return [MyObject]()
}
override func cellId() -> String {
return "AnotherCellId"
}
}
答案 1 :(得分:0)
为什么不创建遵循UITableViewDelegate
和UITableViewDataSource
协议的viewController本身?
只需创建一个类
class UVC : UIViewController, UITableViewDelegate, UITableViewDataSource {
var arr : [MyObject] = []
var tableView!
func deleteRow(i : Int){
arr.removeAtIndex(i)
tableView.reloadData()
}
func addRow(i : Int, obj : MyObject){
arr.insert(obj, atIndex: i)
tableView.reloadData()
}
override func viewDidAppear(){
// Initialize tableView.
}
..cellForRowAtIndexPath... {
cell.text = arr[indexPath.row]
}
..numberOfRowsInSection... {
return arr.count
}
... Other Regular functions for Both Delegates/Source
}