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

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

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

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

Q&A

0回答

1375閲覧

【Swift3】TableViewのセル選択時に働くSegueが2度目以降正常に機能しない

octo

総合スコア17

Swift

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

0グッド

0クリップ

投稿2017/08/03 14:48

###前提・実現したいこと
UITableViewのセルをタップした際、画面遷移をする仕組みを作っています。
遷移元を画面A、遷移先を画面Bと呼ばせていただきます。
画面Bにも別のUITableViewが存在し、同様にセルをタップすると画面Aに戻ります。

###発生している問題・エラーメッセージ
画面Aにて一度セルをタップし、画面Bに遷移するのは想定通りにうまくいきました。また、画面Bでセルをタップするときちんと画面Aに戻ります。
しかし、2度以上同じ動作をしようとすると、2度目以降、
画面Aでの1回目のタップが反応せず、2回目でようやく画面遷移が起こります。

###該当のソースコード
<画面Aにおけるセル選択とSegue設定部分>

swift

1//画面Bから戻って来たときに、セルをdeselect 2 override func viewWillAppear(_ animated: Bool) { 3 super.viewWillAppear(animated) 4 if let indexPathForSelectedRow = lectureSettingTableView.indexPathForSelectedRow { 5 lectureSettingTableView.deselectRow(at: indexPathForSelectedRow, animated: true) 6 print("Deselect") 7 } 8 } 9//セルが選択された際、segueを起動。 10 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 11 print("I'm selected") 12 performSegue(withIdentifier: "toNextView", sender: nil) 13 }

<画面BにおけるSegue設定部分>

swift

1func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 2 performSegue(withIdentifier: "goBack", sender: nil) 3 }

###試したこと
動作の各所に上記の通りprint()を挟み、正常に機能しているか確認しました。
すると、画面Bから画面Aへ戻って来たときには"Deselect"が出力され、正常にdeselectされていることがわかりました。

しかし、画面Aにおける2度目以降(画面Bから戻って来て以降)のセルタップ時には
・1回目タップ:print("I'm Selected")だけが行われる
→2回目タップ:performSegueが呼ばれる(画面Bに遷移する)
と動作していることがわかりました。

セルがdeselectされておらず、一回のタップではselectされないのが原因かと考えていたのですが、どうやら違うようです。原因が思い当たらず困惑しております。
何か、この辺が怪しい、などでも構いませんのでヒントをいただけると助かります。

よろしくお願いいたします。

###補足情報(言語/FW/ツール等のバージョンなど)
swift3、Xcode8を使用。

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

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

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

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

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

fuzzball

2017/08/03 15:10

2つのsegueの内容を具体的に書いて下さい。
octo

2017/08/03 15:32

コメントありがとうございます!画面A→画面BのsegueはStoryBoard上でShowで接続、画面B→画面Aのsegueは画面AのViewControllerに「@IBAction func goBack(_ segue:UIStoryboardSegue) {}」と書いたのち、画面BのExitをこれに繋いでUnwind segueとして設定しています。
fuzzball

2017/08/04 01:02

試してみましたが、2度目以降も問題なく遷移出来ました。Navigation Controllerは使用していますか?あと、念のために確認しますが、2回目タップのときもprint("I'm Selected")は実行されてるんですよね?他にも書ける情報があったら書いて下さい。
octo

2017/08/04 01:07

Navigation Controllerは使用していません。改めて試したところ、2回目のタップの際にはprint("I'm Selected")は実行されず、また、2回目はどこをタップしても(セル以外の場所をタップしても)画面遷移することがわかりました。
fuzzball

2017/08/04 01:15

iOSのバージョンを教えて下さい。あと、Unwind segueの設定についてもっと詳しく(やったことを漏らさずに)書いて下さい。出来れば、一度segueを削除して再設定しながら手順を書き出して下さい。
octo

2017/08/04 01:33

特に設定していないので、iOS10.3です。Unwind segueについてはじめから再設定してみました(依然、同様の症状が出ます)。①画面A内に「@IBAction func goBack(_ segue:UIStoryboardSegue) {}」を準備。②StoryBoard上で画面BのExit(赤いアイコン)をクリック。③右のメニューのpresentingSeguesにgoBackがあることを確認し、controlキーを押しながら画面に繋げる。表示された「manual」を選択。④先述のExitの下にUnwindSegue(goBack)が追加されるため、Identifierに「goBack」を記入。⑤画面BのViewControllerで、セル選択時の関数に「performSegue(withIdentifier: "goBack", sender: nil)」を記載。以上の手順になります。
fuzzball

2017/08/04 01:52

Unwindに関しては問題無さそうですね。質問内に書かれていないコードをコメントアウトして(ただし tableView(_:cellForRowAt:) は dequeueReusableCell(withIdentifier:for:)とreturn cellを残す)、症状が出るかどうか試して下さい。あと、ViewControllerに乗っているのはTableViewだけですか?
octo

2017/08/04 02:59

searchbarなど色々と乗っていたのですが、とりあえずtableViewに必要最低限のものまでコメントアウトしてみても治らなかったので、初めからtableを作りなおしてみます。また新しく何かわかったら追記します!
fuzzball

2017/08/04 03:35 編集

作り直すと直るパターンはよくある話ですw ただ、それだと原因が分からなくなっちゃうんですよね‥。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問