LoginSignup
1
2

More than 3 years have passed since last update.

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

Posted at

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

前提条件

  • 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周りに知見がおありの方、「ここが怪しいんじゃないの?」的なご意見ございましたら是非ともお願いします(_ _)

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2