LoginSignup
21
10

More than 3 years have passed since last update.

Xcode12でUITableViewCell内のタップが反応しない・挙動がおかしい

Last updated at Posted at 2020-09-02

環境

  • Xcode 12 Beta 6
  • iOS 14 Beta 6

※ この記事で言及している問題は、Beta版ではなく正式版になると解決される可能性があります。あくまでBeta 6時点での解決方法としてお読みください。

発生した問題

Xcode12でビルドしたアプリをいじっていると、UITableViewを使っている画面でタップが効かなかったり挙動が変わったりしている画面を発見しました。具体的には、cell内のUISwitchが押せなかったり、cellにaddSubviewしたUICollectionViewのcellをタップしてもdidSelectItemAtが呼ばれなかったりしました。Xcode 11でビルドしていたら押せたのに。。。

原因

調べていくと、cellの子ViewであるcontentViewにタップを奪われてUISwitchやUICollectionViewをタップできていなかったことがわかりました。storyboardやxibを使ってcellのcontentViewに乗せている場合は起こらなかったのですが、発見した箇所はすべてコード上でcellに直接addSubviewしている画面でした。

修正方法

contentViewにタップを奪われているので、contentViewをタップに反応しないようにすればよいです。適時、

ViewController.swift
cell.contentView.isUserInteractionEnabled = false

を実行しましょう。

追記(2020/09/22)

コメントにてご指摘いただきました。パフォーマンスの観点から、iOS 14ではUITableViewCellとUICollectionViewCellがcontentViewの生成を遅延して実行するようになったようです。
https://twitter.com/smileyborg/status/1276623197207531520

また、cellに直接addSubviewしているのは本来の使い方ではなく、contentViewにaddSubviewするのが正しいです。contentViewにaddSubviewしていれば今回のバグは起こりませんでした。
https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview

今回のバグは、Appleが「正しい実装をしていれば開発者には影響がないはず」という修正を加え、その部分がこのアプリでは正しく実装されていなかったゆえに起こったバグでした。ですので、cellに直接addSubviewしている部分を適時contentViewに変えるのが正しい修正方針です。

ViewController.swift
cell.addSubview(view)             // これを
// ↓↓↓↓↓↓↓↓↓↓↓
cell.contentView.addSubview(view) // こっちに書き換える

おわりに

新しいXcodeへの対応は情報が少なくて大変ですが、原因がわかった時はいろんな問題が一気に解決していくのが楽しいですね。

21
10
4

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
21
10