广义的 UITableViewDelegate 和 UITableViewDataSource

Posted

技术标签:

【中文标题】广义的 UITableViewDelegate 和 UITableViewDataSource【英文标题】:Generalized UITableViewDelegate and UITableViewDataSource 【发布时间】:2016-01-01 19:59:17 【问题描述】:

我使用的是 Swift 2.0,并且我有一堆功能非常相似的视图控制器:

它们每个都由一个数组支持 这个数组的每一项都映射到一个UITableViewCell 有一个删除功能可以删除 UITableViewCell 和一个对象 有一个新的空行来添加一个新对象 每个控制器都定义了 5-6 个方法,它们的作用完全相同(只是使用不同的后备数组)

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

包含数据的数组 UITableViewCell身份证 等

我与它战斗了几天。我能够获得可以处理大多数情况的非常通用的课程。我正在努力推动它处理几个额外的案例。

然而,对我来说最大的问题是能够以某种方式将一个数组传递给这个泛化,它可以在这个泛化类内部进行修改(删除和插入新对象)。

问题是传递数组的快捷方式(创建它的副本)。我问了关于它的问题Storing a reference to array in swift 但是,我觉得我没有足够的灵活性来概括它。

有人见过解决这种泛化问题的方法吗?有什么想法吗?

【问题讨论】:

你试过用 NSArray 对象代替 swift 的数组结构吗? 【参考方案1】:

我会创建一个超类,其中包含您需要实现的所有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"
    

【讨论】:

【参考方案2】:

为什么不自己创建一个遵循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

【讨论】:

以上是关于广义的 UITableViewDelegate 和 UITableViewDataSource的主要内容,如果未能解决你的问题,请参考以下文章

无法覆盖 UITableViewDataSource 和 UITableViewDelegate

分离 UITableViewDelegate 和 UITableViewDataSource 导致没有数据显示

UIViewController 和 UITableViewDelegate 之间的通信

符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?

swift 使用枚举的UITableViewDataSource和UITableViewDelegate的示例。

Swift 3.0 和 Xcode 8 迁移后未调用 UITableViewDelegate 方法