質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

3回答

5035閲覧

UITableViewCell内のどこがタップされたか

cross

総合スコア10

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

1クリップ

投稿2016/07/13 01:25

編集2016/07/13 01:30

###前提・実現したいこと
UITableViewCell内にUIButtoやUILabel、UITextViewが複数あります。
親のUITableViewControllerのdidSelectRowAtIndexPathでcell内の表示を切り替えています。
今まではセルのどこをタップしてもその切り替え処理をやっていましたが、
セル内のあるUITextViewをタップした場合は切り替え処理を行わないように変更することになりました。

###試したこと
そもそもUITextViewをタップした場合にdidSelectRowAtIndexPathが呼ばれなければいいと考え、UITableViewCellの派生クラスでpointInsideにて、タップされたコントロールがUITextViewだったらtrueを返し、呼ばれないようにしました。
→UITextViewの文字選択や、HTMLを表示した場合のリンクもできなくなったので却下

###知りたいこと
おそらく以下のどちらかで実現可能だと思いますが、他に方法があるかどうかや
以下の実現方法があれば知りたいです。
・didSelectRowAtIndexPathでタップされたCellのどのコントロール領域をタップしたか判定するåå
・あるUITextViewのタップ時の処理自体は行うが、didSelectRowAtIndexPathは呼ばれないようにする

###補足情報(言語/FW/ツール等のバージョンなど)
XCode7.3.1, iOS8.3〜
言語はSwiftですが役立つ情報であればObjectiveCでもいいので知りたい。

mondaminZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ユーザーからの操作をUITextViewで受け取るようにするとdidSelectRowAtIndexPath が呼ばれないので以下のように設定すると簡単に解決できると思います。
※ Storyboardでも設定可能

swift

1textView.userInteractionEnabled = true

投稿2016/07/13 04:10

編集2016/07/13 04:11
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cross

2016/07/13 04:30

ご回答ありがとうございます。 UITextViewは文字列を選択させたり、HTMLを表示しリンクをタップしてブラウザ起動させたりする関係上、 すでにuserInteractionEnabledはtrueになっております。 ですが、親であるUITableViewControllerの派生クラスのdidSelectRowAtIndexPathが 呼び出されている状況です。
_Kentarou

2016/07/13 04:42

今試していて気づいたのですが、UITextViewの下にBaseのView等がありそのuserInteractionEnabledがfalseになっている場合反応しました。 もしそのような構造になっているのでしたら、そちらもtrueに変更してください。
cross

2016/07/13 06:27

確認しました。 UITableViewController | TableView | | TableViewCell | | | View | | | | Button | | | | ImageView | | | | Label | | | | : | | | | UITextView という構成でしたが、baseのViewもuserInteractionEnabledはtrueでした。
guest

0

新規で添付画像のようなStoryboardを作成しました。
各UIの設定はデフォルトのままです。

この状態で、TextViewをタップしてもdidSelectRowAtIndexPathは呼ばれません。
UIButtonをタップしても呼ばれません。
オレンジ色の部分をタップしたときだけ呼ばれます。
これではダメなのでしょうか?

ちなみに、User Interaction Enabledは、全てのUI(TableView~Button)でチェックが入っています。

Table View Controller

投稿2016/07/13 07:46

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cross

2016/07/13 10:06

確かに新規プロジェクトを作って試したところ、userInteractionEnabledをtrueにしておけば呼び出されないことを確認しました。 ということは、コード上もしくはstoryboardかどこかに悪さをする処理が入っていそうなので 時間はかかると思いますが、解析してフィードバックいたします。
guest

0

お行儀悪い方法としては、UITableViewCellをサブクラスして、それに例えばownerというプロパティを持たせて、
tableView:cellForRowAtIndexPath: でセルを作るときに
cell.owner = self;
みたいにして親への参照を持たせるとわりと好き勝手できます;

投稿2016/07/13 07:10

YokemuraTakeshi

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問