我创建了一个我非常喜欢的表视图 - 它在委托函数tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
中播放了一些不错的动画。
问题是,我找不到在我的代码库中的其他地方复制该行为的方法,而无需复制并粘贴委托函数中的代码并违反DRY。我希望能够从一个地方调整项目中所有tableviews的动画参数。
首先,我尝试编写UITableView
的子类,但这并不好,因为动画是在委托函数中指定的。您可以使子类成为自己的委托并定义所需的行为,但其包含的其他任何委托函数都不可用于其包含的视图。
我考虑过编写一个继承自UITableViewDelegate
的协议,但是你必须重新实现协议中的每个tableview委托函数,即使其中只有一个是不同的。
我想过尝试调整willDisplayCell函数,但我不确定它是否会起作用,如果我远离它,我真的不想乱七八糟。
我怎么能把这样的东西拉下来?在这个非常具体的情况下,以及更普遍的OOP意义上,想要为委托函数提供默认行为而不必将类设置为自己的委托?
答案 0 :(得分:2)
你不应该是UITableView的子类,也不应该是swizzle,也不应该扩展委托协议。
我要做的是编写一个实现和包装委托方法的类。这个类可以拥有它自己的委托,但我宁愿给它闭包来调用。
public void onResume() {
LOG.i("+++++++ OnResume is Called");
super.onResume();
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
LOG.i("++++++ Active Network Connected :: " + activeNetInfo.isConnected());
}
一个完整的例子:
class TableViewDelegate: UITableViewDeleagte {
var willDisplayCell: ((UITableView, UITableViewCell, IndexPath) -> Void)?
let animator: Animator
weak var tableView: UITableView? {
didSet {
tableView?.delegate = self
}
}
init(tableView: UITableView, animator: Animator) {
self.animator = animator
}
func tableView(_ tableView: UITableView, willDisplay cell: UItableViewCell, forRowAt indexPath: IndexPath ) {
animator.animate(cell)
willDisplayCell?(tableView, cell, indexPath)
}
}
答案 1 :(得分:1)
创建UIViewController
子类所有动画tableViews继承自:
class BaseAnimatedTableViewController: UIViewController, UICollectionViewDelegate {
var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView = UITableView
//setupTableView
tableView.delegatge = self
}
//override delegate methods, that all subclasses should share
}
并为每个动画tableView子类化它:
class AnimatedTableView1: BaseAnimatedTableViewController, UITableViewDataSource {
...
}
class AnimatedTableView2: BaseAnimatedTableViewController, UITableViewDataSource {
...
}
您当然也可以继承UITableViewController
而不是UIViewController
。