广义的 UITableViewDelegate 和 UITableViewDataSource
Posted
技术标签:
【中文标题】广义的 UITableViewDelegate 和 UITableViewDataSource【英文标题】:Generalized UITableViewDelegate and UITableViewDataSource 【发布时间】:2016-01-01 19:59:17 【问题描述】:我使用的是 Swift 2.0,并且我有一堆功能非常相似的视图控制器:
它们每个都由一个数组支持 这个数组的每一项都映射到一个UITableViewCell
有一个删除功能可以删除 UITableViewCell
和一个对象
有一个新的空行来添加一个新对象
每个控制器都定义了 5-6 个方法,它们的作用完全相同(只是使用不同的后备数组)
它们都很相似,我想创建一个通用的 UITableViewDelegate
和 UITableViewDataSource
,我可以在每个视图控制器中实例化它们并只传递视图控制器的特定信息,例如
UITableViewCell
身份证
等
我与它战斗了几天。我能够获得可以处理大多数情况的非常通用的课程。我正在努力推动它处理几个额外的案例。
然而,对我来说最大的问题是能够以某种方式将一个数组传递给这个泛化,它可以在这个泛化类内部进行修改(删除和插入新对象)。
问题是传递数组的快捷方式(创建它的副本)。我问了关于它的问题Storing a reference to array in swift 但是,我觉得我没有足够的灵活性来概括它。
有人见过解决这种泛化问题的方法吗?有什么想法吗?
【问题讨论】:
你试过用 NSArray 对象代替 swift 的数组结构吗? 【参考方案1】:我会创建一个超类,其中包含您需要实现的所有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"
【讨论】:
【参考方案2】:为什么不自己创建一个遵循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
【讨论】:
以上是关于广义的 UITableViewDelegate 和 UITableViewDataSource的主要内容,如果未能解决你的问题,请参考以下文章
无法覆盖 UITableViewDataSource 和 UITableViewDelegate
分离 UITableViewDelegate 和 UITableViewDataSource 导致没有数据显示
UIViewController 和 UITableViewDelegate 之间的通信
符合 Swift 中的 UITableViewDelegate 和 UITableViewDatasource?