🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

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

Swift

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

Q&A

2回答

1980閲覧

NavigationControllerを利用した状態でモーダルを閉じた時に同時に更新をかけたい

shotakeu

総合スコア386

iOS

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

Swift

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

0グッド

0クリップ

投稿2019/10/13 07:17

前提・実現したいこと

当方swiftに関しては初心者です。

UINavigationViewを用いたプロジェクトで、Twitterクライアントを開発しています。
投稿用画面をモーダルで表示し、投稿が完了したら同時に前画面のタイムラインを更新させたいと思っています。
しかし、同じようなことをここで試そうとしている方がいて、NavigationControllerを利用しているとうまくいかない、という旨が記述された質問を見つけました。

私も上記記事を参考に下記コードを試したのですが、やっぱりNavigationControllerを介しているため、更新処理がうまくできません。
でもやっぱり、NavigationControllerを利用した状態で、実現したいことができないか?とあれこれ試してみたのですが、どうもうまくいきません。

発生している問題・エラーメッセージ

NavigationControllerを利用した状態でモーダルを閉じた時に同時に更新をかけたいが、うまくいかない

該当のソースコード

swift

1 private func postTweet(userID: String, postContent: String?) { 2 // FIXME : こいつから成功か失敗かを返した方がいい 3 TwitterAPI.postTweet(userId: userID, postContent: postContent!) 4 5 guard let parent = storyboard?.instantiateViewController(withIdentifier: "TimelineViewController") as? TimelineViewController else { 6 fatalError() 7 } 8 print(parent) 9 10 // 呟いたら消す 11 navigationController?.popViewController(animated: true) 12 self.dismiss(animated: true, completion: nil) 13 }

この他、下記も試しました。(質問に載っている方法です)

swift

1 override func viewWillAppear(_ animated: Bool) { 2 super.viewWillAppear(animated) 3 if let presented = self.presentedViewController { 4 if type(of: presented) == TwitterPostViewController.self { 5 //PopupViewControllerから戻ってきたときはrefresh() 6 self.loadTweets() 7 } 8 } 9 }

試したこと

上記の通り

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

xcode version :11.1
target:iOS13.0
swift version:4
テスト端末:iPhone8(実機)

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

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

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

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

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

guest

回答2

0

iOS13のModal遷移はデフォルトだとDismiss時に遷移元のviewWillAppear等が呼ばれない
この記事が参考になると思います。

これとは別に、モーダルを閉じきったとき(viewDidDisappear)に更新処理を呼び出す方法を書いておきます。

swift

1var timelineViewController: TimelineViewController? 2 3override func viewDidLoad() { 4 super.viewDidLoad() 5 //TimelineViewController取得 6 timelineViewController = (self.presentingViewController as? UINavigationController)?.viewControllers.last as? TimelineViewController 7} 8 9override func viewDidDisappear(_ animated: Bool) { 10 super.viewDidDisappear(animated) 11 //更新処理 12 timelineViewController?.loadTweets() 13} 14

期待している動作になっているかどうか分かりませんが、都合のよい方でどうぞ。

投稿2019/10/25 07:01

fuzzball

総合スコア16733

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

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

0

そもそもの設計の問題になると思いますが、
最初にviewを表示した時、データの更新は行なっていますか?

例えば、viewDidLoad()でデータのダウンロードをし、
tableViewのdatasourceの各所で表示をしているとしましょう。
この時、一旦アプリをバックグラウンド(電話がきた、メールを見に行くetc)
で中断がかかった場合どうなるでしょう?
10minとか経過した後、ホームボタン2重クリックから、
アプリを再度フォアグラウンド(表示)した場合、
viewDidLoad()は実行されないので、データは更新されず、
古い状態のまま表示されることとなります。

上記はきっとshtr_tさんの望む動きではないと思います。

なので、そもそもmodalをdismissし戻ったタイミング「だけ」じゃなく、
いつでも表示される時はデータを最新にし、更新した方が合理的だと思います。

そう考えると、viewWillAppearかviewDidAppearに
データを読み込むコードを書き、reloadData()をしなければなりません。

とすると、modalをdismissした時にという限定条件はなく、そういうコードをする必要もなく、
単純に downloadData() -> reloadData()とすればいいのではないでしょうか?

投稿2019/10/13 15:55

編集2019/10/13 15:57
hameji

総合スコア1380

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

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

shotakeu

2019/10/14 06:58

hamejiさんの仰る通り、常に更新された情報を表示したいのはヤマヤマなのですが、「バックグラウンドからフォアグラウンド」といったタイミングで更新されるのは現状のTwitter公式アプリではない仕様(間違っていたらすみません)なのと、なるべくユーザーが更新したいタイミングに更新をおまかせしたいという意図があります。というのもTwitterAPIのhometimelineAPIの上限が厳しいからです。 > そう考えると、viewWillAppearかviewDidAppearに > データを読み込むコードを書き、reloadData()をしなければなりません。 とはいえ、設計的にはhamejiさんのいう通りが理想系だと思います。 viewWillAppearは試したのですが、モーダルを閉じた時にはリロードは走りませんでした。 tableViewの更新処理に問題がある気がしていますが、詳細は調査中です。 ご回答いただきありがとうございます。
hameji

2019/10/18 10:09

よく仕様書を読んでませんが、hometimelineAPIの上限が厳しいのなら、、、 ユーザーにボタンを押させるかスクロールさせる等のactionを求めるのが 一番の節約になるのではないでしょうか? とはいえ、不便なアプリになってしまうでしょうね。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問