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

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

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

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

Q&A

解決済

2回答

708閲覧

tabbarviewcontroller内のviewcontrollerを選択してメソッドの処理を行いたい。

okkyu

総合スコア18

Swift

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

0グッド

0クリップ

投稿2021/01/20 19:27

編集2021/01/22 09:26

自分が実現したいことの内容が整理できておらず、言葉足らずであったり、またコードも自分が煮詰まっている状態で書いてしまったもので余計にわかりずらかったかと思います。申し訳ありません。そして回答いただけた方々本当ありがとうございます。
タイトルでは”tabbarviewcontroller内のviewcontrollerを選択してメソッドの処理を行いたい。”という質問だったのですが、実現したいことは、他のクラスにアクセスしてメtableViewをreloadする方法です。

色々と調べた結果参考になる情報があり解決しました。
https://www.366service.com/jp/qa/b1e0da804765705aff3a1d2deedc9a60

※前回の質問内容
下記ですとtabbarVCの中身をforEachでループさせて条件の合うターゲットのvcのメソッドを処理したいのですが、手詰まっております。また片方にはNavigationControllerで遷移しています。このやり方では全くダメだったのでどうか言葉足らずで申し訳ありませんがご助言をいただけたら幸いです。```swift
コード

```swift let tab = self.tabBarController as! TabbarViewController let viewControllers = tab.viewControllers let nav = tab.selectedViewController as! UINavigationController viewControllers?.forEach({ (viewController) in if viewController is ChatListViewController{ let vc = nav.viewControllers[nav.viewControllers.count-2] let chatListVC = vc as? ChatListViewController chatListVC?.fetchChatRoom() }else if viewController is ContactUserViewController{ let chatListVC = viewController as? ChatListViewController chatListVC?.fetchChatRoom() } })

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

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

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

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

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

TsukubaDepot

2021/01/20 19:37

なにがどうだめだったのか(実行時エラーが出たのかなど)、どの部分で処理が上手くいってないのか、またそのように判断した理由などを添えていただかないと、具体的な解決法はご指摘できないかもしれません。 ご提示のコードだt let nav = tab.selectedViewController as! UINavigationController で、選択されている ViewCOntroller が UINavigationController の派生クラスと決めつけていますが、ここはこれで大丈夫なのでしょうか。 tab.sekectedIndex で何番目のタブが選択されているのかわかるので、それを使った方が安全のような気もします。
hoshi-takanori

2021/01/20 19:42

・viewControllers?.forEach の前に nav. が抜けてませんか? ・if viewController is ChatListViewController なら、その viewController が目的の ChatListViewController なので、let vc = nav.viewControllers[nav.viewControllers.count-2] は不要では? ・else if viewController is ContactUserViewController の時に、viewController を ChatListViewController にするのは変では? ・というか、if let をうまく使えば if の条件が通った後にまたキャストする必要はありません。
okkyu

2021/01/22 09:33

ご回答ありがとうございます。指摘いただいた通り色々とミスしていました。質問の内容を修正いたします。
guest

回答2

0

ベストアンサー

TabBar Controller -+- Navigation Controller - ChatListViewController | +- ContactUserViewController

のような階層で、TabBar Controller 内のメソッドでご提示のような処理を行いたい、ということであれば、

Swift

1self.viewControllers?.forEach({ (viewController) in 2 if viewController is UINavigationController { 3 let vc = (viewController as? UINavigationController)?.viewControllers.first 4 let chatListVC = vc as? ChatListViewController 5 chatListVC?.fetchChatRoom() 6 }else if viewController is ContactUserViewController{ 7 let chatListVC = viewController as? ContactUserViewController 8 chatListVC?.fetchChatRoom() 9 } 10 })

のような処理を行いたいのでしょうか。

  1. TabBar Controller が持ってるプロパティ viewControllersforEach でひとつづつ取り出し、

  2. それが UINavigationController のインスタンスであれば、

2-1) UINavigtionController のプロパティ viewControllers から、とりあえず先頭の viewControlelr を取り出し
2-2) fetchChatRoom()を実行する

3)ContactUserViewController のインスタンスえあれば,fetchChatRoom()を実行する

全体的な階層構造や実装が分かりませんし、NavigationStack のどこに収められた ViewController のメソッドである fetchChatRoom() を実行するのかわからないため、この実装でよいのか分かりませんが(ご提示いただいたコードだと一番後ろから二番目、とはなっていますが)、こんな感じだろうな、という予想で書いてみました。

投稿2021/01/21 02:33

TsukubaDepot

総合スコア5086

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

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

okkyu

2021/01/21 05:26

説明不足すぎて申し訳ありません。ChatMessageViewControllerというclassを設けておりましてTabbarViewController内にChatListVC、ContactUserVCというviewControllerを設けています。各VCからはChatMessageViewControllerにnavigationControllerで遷移するメソッドが構成されていて以下のようなパターンで構成をしたいと思っております。 A:ChatListVC → ChatMessageVC(ChatListVC内のメソッド実行) B:ContactUserVC → ChatMessageVC (ChatListVC内のメソッドを実行) AパターンはnavigationControllerを遡ってChatListにアクセスしてメソッドを実行する構造です。 しかし悩んでいるのが BパターンでContactUserVCから遷移して遡ってChatListVCにアクセスはできません。 他にも色々試してみたのですが、うまくいかず悩んでおります。 深夜作業で煮詰まっており説明が雑すぎました。申し訳ありません。
TsukubaDepot

2021/01/21 06:08

せっかく説明していただいて恐縮なのですが、クラスの依存関係がよくわからないので、私の解答の初頭みたいにマークダウンを用いてASCII文字で依存関係をご説明いただくか、あるいは手書きでも良いので各クラスの依存関係を作成し、キャプチャして「ご質問本文」に追記いただけないでしょうか。StoryBoard で Segue を使っているようであれば、それも参考になると思います。 ご質問本文を編集して記載していただくと、hoshi-takanori さんにも見えるので、別解が届く可能性もあるかと思います。 ただ、なんとなく「delegateパターン」を用いると解決するのではないか、という気はしています。
guest

0

色々と調べた結果参考になる情報があり解決しました。
https://www.366service.com/jp/qa/b1e0da804765705aff3a1d2deedc9a60

投稿2021/01/22 09:28

okkyu

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問