Xcode
UIScrollView
Swift
UITableViewDelegate

UITableViewDelegateに準拠したクラスを継承した時にUIScrollViewDelegateメソッドが呼ばれない場合の対処法

レア?なケースに直面したので備忘として。


前提条件


  • UITableViewDelegateに準拠したクラスを準備


BaseClass


class BaseClass: UITableViewDelegate {
・・・(省略)
}



  • BaseClassを継承した子Classを二つ用意


ChildClassA

class ChildClassA: BaseClass {

・・・(省略)
// 例えばこのメソッドを定義
func scrollViewDidScroll(_ scrollView: UIScrollView) { print("A") }
}



ChildClassB

class ChildClassB: BaseClass {

・・・(省略)
// 例えばこのメソッドを定義
func scrollViewDidScroll(_ scrollView: UIScrollView) { print("B") }
}



実行結果(各画面でスクロールさせた時)


結果

A <- なぜか片方しか実行されない



対応


BaseClassで空のDelegateメソッドを実装して、子ClassでOverRideするようにした


BaseClass


class BaseClass: UITableViewDelegate {
・・・(省略)
// 空メソッドを定義
func scrollViewDidScroll(_ scrollView: UIScrollView) {}
}



  • BaseClassを継承した子Classを二つ用意


ChildClassA

class ChildClassA: BaseClass {

・・・(省略)
// オーバーライド
override func scrollViewDidScroll(_ scrollView: UIScrollView) { print("A") }
}



ChildClassB

class ChildClassB: BaseClass {

・・・(省略)
// オーバーライド
override func scrollViewDidScroll(_ scrollView: UIScrollView) { print("B") }
}



再実行結果(各画面でスクロールさせた時)


結果

A

B

あまりスマートな解決方法ではないと思いますが、一応やりたいことは出来ました。

かなり簡略化してますが、基本的にはこの構成になっており自分が調査した限りではAとBの違いを見出せず...

UIScrollView周りに知見がおありの方、「ここが怪しいんじゃないの?」的なご意見ございましたら是非ともお願いします(_ _)