广义的UITableViewDelegate和UITableViewDataSource

时间:2016-01-01 19:59:17

标签: ios arrays swift uitableview

我使用的是Swift 2.0,我有很多具有非常相似功能的viewcontrollers:

  • 每个都有数组支持
  • 此数组的每个项目都映射到UITableViewCell
  • 删除UITableViewCell和对象
  • 的删除功能
  • 添加新对象时有一个新的空行
  • 每个控制器定义5-6个完全相同的方法(只是使用不同的后备阵列)

它们都足以让我想要创建一个通用的UITableViewDelegateUITableViewDataSource,我可以在每个视图控制器中实例化它,只传递viewcontroller特定的信息,如

  • 包含数据的数组
  • UITableViewCell id

我正在和它斗争几天。我能够得到相当普遍的类,可以处理大部分情况。我正试图推动其处理其他几个案件。

但是,对我来说最大的问题是能够以某种方式传递一个数组到这个通用的数组,可以在这个通用类中修改(删除和插入新对象)。

问题是传递数组的快捷方式(创建它的副本)。我问过它的问题example here但是,我觉得我没有足够的灵活性来概括它。

有没有人看到解决这种概括的方法?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我会创建一个包含您需要实现的所有UITableViewDataSourceUITableViewDelegate方法的超类。然后我会在您在子类中重写的超类中创建可覆盖的方法。超类在需要从委托方法获取数据等时调用这些方法。

子类从超类重写的方法示例。

// 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)

为什么不创建遵循UITableViewDelegateUITableViewDataSource协议的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
}