UITableViewをサブクラス化したり、デリゲートプロトコルをスウィズルしたり、拡張したりしないでください。
私が行うことは、デリゲートメソッドを実装してラップするクラスを作成することです。このクラスは独自の代理人を持つことができますが、私はむしろそれを呼び出すためにクロージャを与えます。
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クラスのデリゲートとデータソースを実装し、実世界のプロジェクトで
protocol AnimatorType {
func animate(view: UIView)
}
class Animator: AnimatorType {
func animate(view: UIView) {
view.transform = CGAffineTransform(translationX: -30, y: 0)
UIView.animate(withDuration: 0.3, animations: {
view.transform = CGAffineTransform.identity
})
}
}
class TableViewDataSource:NSObject, UITableViewDataSource {
let data = Array(0 ..< 30).map{ $0 * $0 }
init(tableView: UITableView) {
self.tableView = tableView
super.init()
tableView.dataSource = self
}
weak var tableView: UITableView?
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
let v = data[indexPath.row]
cell.textLabel?.text = "\(v)"
return cell
}
func object(at indexPath: IndexPath) -> Int{
return self.data[indexPath.row]
}
}
class TableViewDelegate:NSObject, UITableViewDelegate {
var willDisplayCell: ((UITableView, UITableViewCell, IndexPath) -> Void)?
var didSelectCell: ((UITableView, IndexPath) -> Void)?
let animator: AnimatorType
weak var tableView: UITableView?
init(tableView: UITableView, animator: AnimatorType) {
self.tableView = tableView
self.animator = animator
super.init()
tableView.delegate = self
}
private var highestIndexPath = IndexPath(row: -1, section: 0)
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.row > highestIndexPath.row {
animator.animate(view: cell)
highestIndexPath = indexPath
}
willDisplayCell?(tableView, cell, indexPath)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
didSelectCell?(tableView, indexPath)
}
}
class ViewController: UIViewController {
var tableViewDataSource: TableViewDataSource?
var tableViewDelegate: TableViewDelegate?
let animator = Animator()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
self.tableViewDataSource = TableViewDataSource(tableView: tableView)
self.tableViewDelegate = TableViewDelegate(tableView: tableView, animator: animator)
self.tableViewDelegate?.didSelectCell = {
[weak self] tableView, indexPath in
guard let `self` = self else { return }
print("selected: \(self.tableViewDataSource!.object(at: indexPath))")
}
}
}
シングルクロージャコール。実際には、OFAPopulatorと呼ばれるそのようなクラスを設計するための(objective-c)フレームワークを書いています。
画面の並べ替えをしてください。 – Sanjukta
スクリーンショットが大いに役立つかどうかはわかりませんが、うまくいけば私はもっと明確にしようとしています。 – Erik