UIViewからUITableViewのカスタムセルを作るとボタンタップイベントが取れない

現象

UITableVIewのカスタムセルにボタンを置いて、タップ用の処理を書いたがタップイベントを検知できない。

原因

ボタンの上のレイヤーに、UITableViewCellContentView というビューが描画されており、このビューに邪魔されてタップイベントが検知できていなかったため。

f:id:y_sumida:20170301094905p:plain

根本原因

カスタムセルのxibファイルを、UITableViewCell ではなく、 UIView を使って作成していたため。

UITableViewCell で作ったxibは、UITableViewCellContentView の上に自分の配置したパーツが描画されています。

f:id:y_sumida:20170301094946p:plain

ちなみに、xibファイルの新規作成すると、デフォルトで UIView が置いてあるというXCodeのおせっかい機能のがほんとの原因かもしれません。

f:id:y_sumida:20170301095134p:plain

対策

カスタムセルを作る際には、xibファイルのデフォルトで置いてある UIView を消して、UITableViewCell を置くと良いです。

f:id:y_sumida:20170301095039p:plain

または、新規ファイルを作成する際に、クラスファイルから作成して、 Cocoa Touch Class を選択して、次の画面で Also create XIB file にチェックを入れると、勝手に UITableViewCell を配置したxibファイルを生成してくれます。

f:id:y_sumida:20170301095245p:plain

f:id:y_sumida:20170301095341p:plain

AutoLayoutに慣れてる人には当たり前なのかもしれないですが、ちょっとわかりにくいなーと思いました。