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

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

受付中

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

cross
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++と共存することが意図されています

3回答

1グッド

1クリップ

4700閲覧

投稿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👍を押しています

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

2

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

swift

1textView.userInteractionEnabled = true

投稿2016/07/13 04:10

編集2016/07/13 04:11
_Kentarou

総合スコア8488

mondaminZ, tekun43👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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でした。

1

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

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

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

Table View Controller

投稿2016/07/13 07:46

fuzzball

総合スコア16727

cross👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

cross

2016/07/13 10:06

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

0

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

投稿2016/07/13 07:10

YokemuraTakeshi

総合スコア296

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

iOS

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

Xcode

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

Swift

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