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

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

解決済

1回答

1019閲覧

segue(show) が戻るときにセルの選択を解除したい

unagimochimochi

総合スコア7

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/07/17 23:00

前提・実現したいこと

segue(show)が戻るときにホーム画面のTableViewのセルを選択解除したい。

Storyboardにてsegue(show)を設定し、
ホーム画面(HomwViewController)のセルをクリックすると予定詳細画面(PlanDetailsViewController)に遷移するようにしています。
Storyboard

↓ホーム画面(HomeViewController)
ホーム画面
「劇場版あいうえお」セルをクリックすると、
↓予定詳細画面(PlanDetailsViewController)に遷移
予定詳細画面

予定詳細画面のナビゲーションバーの「< ホーム」をクリックして戻ったとき、
ホーム画面のセルを選択解除したいです。

発生している問題

現在は選択状態です。
ホーム画面 選択状態

該当のソースコード

以前はセルクリックと同時に解除していたので(現在は無効にしています)以下のように書いていたのですが、

Swift

1func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 2 tableView.deselectRow(at: indexPath, animated: true) 3}

そうではなく、segueが戻ったときに実装したいんですよね。

試したこと

上のようなコードをtableView(_:cellForRowAt:)viewDidLoad()に書いてみたのですが、うまくいかず。
「< ホーム」ボタンに関しても、自分で実装したものではなくsegue(show)を繋いだときに自動生成されたものなので扱い方がよくわかりませんでした。

補足情報(FW/ツールのバージョンなど)

Xcode 11.5
Swift 4.2

ここまで読んでくださり、ありがとうございます。
全体のソースコードがあったほうが回答しやすい、などございましたらお申し付けください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく、

  • 遷移画面から戻ってきたタイミングで「選択状態を消す」

ということを実現されたいのかとおもます。

戻ってきた時のアニメーションが終わった時に呼び出されるメソッドはviewDidAppear(_:)なので、この中でセルの選択解除を行えばいいかと思います。

ちなみに、viewDidAppear(_:)は、初回起動時など tableView が選択されていない時も呼び出されますので、そのような状態になっているか否かを判別する必要もありそうです。

Swift

1override func viewDidAppear(_ animated: Bool) { 2 super.viewDidAppear(animated) 3 print(#function) 4 5 if let indexPatth = tableView.indexPathForSelectedRow { 6 tableView.deselectRow(at: indexPatth, animated: true) 7 } 8 }

indexPathForSelectedRowの値を見て、必要であれば選択解除を行うような処理の流れとなります。

ちなみに、print(#function)は呼び出された時点で処理しているメソッド(関数名)を表示します。
どこにどのような処理を入れれば良いのかは、公式ドキュメントのほか、実際にメソッドが呼び出されるタイミングを見て判断するのも一つの方法かと思います。

「< ホーム」ボタンに関しても、自分で実装したものではなくsegue(show)を繋いだときに自動生成されたものなので扱い方がよくわかりませんでした。

おそらく、UINavigationController と組み合わせて使われているのではないでしょうか。使われている場合には、Segue で接続すると自動的に階層構造を作ってくれるようになっています。

投稿2020/07/18 04:00

TsukubaDepot

総合スコア5086

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

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

unagimochimochi

2020/07/18 05:33

いつもご回答ありがとうございます。 無事、実現したいことを達成することができました。 公式ドキュメントのリンクもありがとうございます。 ご提示してくださったものに加え、もう一度UIViewControllerクラスのページを一読してみます。 おっしゃる通り、UINavigationControllerと組み合わせて使っています。 ドキュメントアウトラインに"Navigation Item"としてメニューバー自体はあるのですが、中のボタン単体で選択できなかったので、 これをクリックしたときの処理はどう書くのかな……と思った次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問