MILLEN BOX

音楽好きの組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

tableView(_:didSelectRowAt:) が呼ばれない場合の原因について調べてみた

私、今まで作成したアプリではあんまりTableViewって使ったことないですが、最近久しぶりに触る機会がありました。

ableViewを使用する場合、ViewControllerにUITableViewDataSourceとUITableViewDelegateを追加して、numberOfRowsInSectionやcellForRowAtなどのデリゲードメソッドを追加しますよね。
ここまでは大丈夫。

そこで、「あ、そうそう。Cellタップしたら「〜」をできるようにしなきゃ」と思い、tableView(_:didSelectRowAt:)を追加しました。
呼ばれるかどうか一応確かめるかーってので、とりあえず中の処理に print("\(#function) is called!") か何かか書いて呼び出し確認をしてみました。

そしたら、、、呼ばれてない。。。何で!?

ということで原因を調べて見ました。

原因1: UITableViewDelegateを追加していない

かなり初歩的ですが、UITableViewDelegateをUIViewControllerに追加していない場合は勿論tableView(_:didSelectRowAt:)は呼ばれません。というかビルドも通らないよね。
私の場合、前述の通りこれについては実行済みでした。

原因2: Selectionが「No Selection」

StoryboardでTable Viewを選択し、Attributes Inspector→Table View→Selectionが「No Selection」になっていないかを確認して下さい。
No Selectionだと、Cellの選択が出来ないのでそもそもtableView(_:didSelectRowAt:)が呼ばれる訳がありません。
「No Selection」を「Single Selection」に変更しましょう。

f:id:anthrgrnwrld:20171026201039j:plain

ネットを調べた限り、これが原因で問題が発生しているケースが多そうでした。
しかし私の問題はこれでは解決しませんでした。

原因3: sampleTableView.delegate = self

UITableViewDelegateを追加した場合には、当然誰に処理を委任するのか指定してあげないと行けないですよね。
この場合だと通常、sampleTableView.delegate = self でOKかと思います。
これもかなり初歩的は部分です。
当然、やってま…..ん??

うそ?やってない!?

まさかね。。。これとは。。。
かなり初歩的ですが、初歩的すぎて逆に見つけられないという。
(言い訳)

当たり前のことから見直さないとだめですね。。。