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

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

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

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

Q&A

解決済

1回答

721閲覧

複数のタブメニューに別々のリンク先ハンバーガーメニューを設置する swift4

ludolf

総合スコア39

Swift

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

0グッド

0クリップ

投稿2019/08/06 02:40

いつもお世話になっております。

以前から作成しているPagingMenuControllerを用いたウェブアプリのことでまたまたご質問がございます。
(決して全部聞けばいいやなどと考えておりません、、)

↓↓pagingMenuController↓↓
https://github.com/kitasuke/PagingMenuController/blob/master/README.md

↓↓参考サイト↓↓
https://nobuhiroharada.com/2018/01/28/swift4-pagingmenu/

参考サイトを実装し各タブにドメインは一緒だが違うディレクトリのURLを設置しています。
↓↓例↓↓
赤:https://hogehoge.com/AAA/index.php
青:https://hogehoge.com/BBB/index.php
黄:https://hogehoge.com/CCC/index.php

上記のタブにNavigationBarを設置しそこにハンバーガーメニューを設置しました。

ハンバーガーメニューを押したら、presentでハンバーガーメニュー用のClass「MenuViewController」に遷移し、一覧を表示します。

ここまでが基本情報で下記から本題の質問です、、
(分からないことがあれば随時追記します。)

例えば今見ている画面が、赤タブだった場合、URLは「https://hogehoge.com/AAA/index.php」ですが、ハンバーガーメニューのサンプルを選択した場合下記のような状態にして、「赤クラス」にあるIBoutletのWKWebViewに値を渡しdismissした後にそのサンプルのURLが見れるようにしたいです。

↓↓例↓↓
赤タブを見ていてタップしたら:https://hogehoge.com/AAA/sample.php
青タブを見ていてタップしたら:https://hogehoge.com/BBB/sample.php
黄タブを見ていてタップしたら:https://hogehoge.com/CCC/sample.php

自分が考えたプログラムが下記です。
全く見当違いなことしているかもしれません。

MenuViewController

1let TODO:[[String]] = [ 2 ["サンプル","sample.php"], 3 ["一覧","list.php"], 4 ["詳細","view.php"], 5 ] 6 7func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 8 return TODO.count 9} 10 11func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 12 // セルを取得する 13 let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 14 // セルに表示する値を設定する 15 cell.textLabel?.text = self.TODO[indexPath.row][0] 16 17 tableView.tableFooterView = UIView() 18 return cell 19} 20func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 21 22 print("(TODO[indexPath.row][0])") 23 24 switch self.title { 25 case "赤クラス": 26 let val:String = "https://hogehoge.com/AAA/" + TODO[indexPath.row][1] 27 28 let redURL = URL(string: val) 29// //総合サイトをリクエスト 30 let urlRequest = URLRequest(url: redURL!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 0) 31 32 let hoge:UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 33 34 let menuViewController = hoge.instantiateViewController(withIdentifier: "赤ストーリボードID") 35 36 if let hogehoge0 = menuViewController as? 赤クラス{ 37 let v = hogehoge0.view 38 hogehoge0.赤クラスIBoutlet.load(urlRequest) 39 dismiss(animated: false, completion: nil) 40 } 41 break 42 case "青クラス": 43 print(self.title) 44 45 break 46 case "黄クラス": 47 print(self.title) 48 break 49 default: 50 print(self.title) 51 break 52 } 53 54 }

MenuViewControllerから「赤クラス」のWKWebViewに値を投げてdismissする仕方がわかりません、、
どなたか解決策をお願いします。

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

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

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

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

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

fuzzball

2019/08/06 02:51

「別々のリンク先」ではなく、同じリンク先なら出来ているということでしょうか?
takabosoft

2019/08/06 02:56

サンプルをタップしたイベントハンドラから、①どうにかしてタブビューコントローラーを取得し、②現在表示中のタブに表示されているビューコントローラーを取得、③そのビューコントローラークラスへ「sample.php」か何かの情報を渡す って感じでしょうか。どこで躓いているんでしょう。
ludolf

2019/08/06 04:39

お世話になっております。 >「別々のリンク先」ではなく、同じリンク先なら出来ているということでしょうか? 同じリンク先でもできていないです。 記入した内容で実行すると何も起きず、dismissされます。 サンプルをタップした時MenuViewControllerで赤クラスのIBoutletを、上記記入してあるように .loadしてdismissしているのですが、思うような動きになってくれません泣 >サンプルをタップしたイベントハンドラから、①どうにかしてタブビューコントローラーを取得し、②現在表示中のタブに表示されているビューコントローラーを取得、③そのビューコントローラークラスへ「sample.php」か何かの情報を渡す takabosoft様のおっしゃる通りです。 躓いている箇所は、上記記入した内容でサンプルをタップすると前のVIew(赤クラスにあるWebview)が変化しないでdismissしてしまします、、 MenuViewControllerで赤クラスのWebViewを変化させようとしていますが、そもそも考え方が違うのか、やり方が違うのかご教授頂ければ幸いです。 追伸 最近delegateの使い方を初歩的ではございますが、一応知識としては知っております。
takabosoft

2019/08/06 08:57

ああ、 let hoge:UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let menuViewController = hoge.instantiateViewController(withIdentifier: "赤ストーリボードID") これは、今目の前に表示されている赤ビューコントローラーを取得するのではなく、新しくインスタンスを生成するやり方なので、そうではなくて、 なんとかして「今目の前に表示されている赤ビューコントローラーを取得」する必要があります(たぶん)。
ludolf

2019/08/06 11:12

>これは、今目の前に表示されている赤ビューコントローラーを取得するのではなく、新しくインスタンスを生成するやり方なので、そうではなくて そうだったんですね、勉強になります。 >なんとかして「今目の前に表示されている赤ビューコントローラーを取得」する必要があります(たぶん)。 今見ている赤ビューコントローラーを取得すると記入されておりますが、一度MenuVIewController(他クラス)に遷移してもインスタンスは残っているのでしょうか? 初歩的な質問で申し訳ないです、、 ViewControllerでハンバーガーを押した時の処理を下記に書いておきます。 //ハンバーガーが押されたときのイベント @objc internal func hambergerButtonTapped(sender: UIBarButtonItem) { let hoge:UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let nextView = hoge.instantiateViewController(withIdentifier: "MenuViewContllerのIdenitifier") as! MenuViewController switch stateMenu { case "赤": nextView.title = "赤クラス" break case "青": nextView.title = "青クラス" break case "黄": nextView.title = "黄クラス" break default: break } self.present(nextView, animated: false,completion: nil) self.navigationController?.pushViewController(MenuViewController(), animated: false) } 遷移する時に遷移先のタイトルを入れ込み、遷移先でtitleに何が入っているか判定して、今見ているタブを判定しています。
guest

回答1

0

自己解決

自己解決しました!

参考サイトで紹介されているやり方では不可能でした。

解決法はtakabosoftさんがおっしゃったようにどうにかして「今目の前に表示されている赤ビューコントローラーを取得」することができれば、本問題は解決できる内容でした。

下記自分が解決した内容です。

まずPagingMenuControllerCustomizableを継承している箇所がprivateにしていて参照できないのでprivateを外します。
下記自分が変更した箇所です。

ViewController

1**struct PagingMenuOptions: PagingMenuControllerCustomizable {** 2 3 //各媒体のビューコンをここで変数に入れ込み 4 let pv1 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "") as! 赤クラス 5 let pv2 = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "") as! 青クラス 6 7 //タブが格納されているmenuOptionsとタブバー全体の使用が格納されているpagingControllersを中に入れ込み 8 **internal var componentType: ComponentType {** 9 return .all(menuOptions: MenuOptions(), pagingControllers: pagingControllers) 10 } 11 12 下記参考サイト通りに 13

privateを外すとローカル変数からグローバルにできるのでグローバル変数にPagingMenuOptionsをインスタンス化している箇所を移動させます。

ViewController

1//グローバル化 2let options = PagingMenuOptions() 3 4override func viewDidLoad() { 5 super.viewDidLoad() 6 7 //ここでインスタンスを生成していたがグローバルにする 8 //PagingMenuController追加 9 //let options = PagingMenuOptions() 10} 11 12override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 13 14 //遷移先のViewController 15 let controller = segue.destination as! MenuViewController 16 17 //遷移先から値取得 18 controller.resultHandler = { val in 19 20 //URLを宣言 ※stateMenuにはAAA・BBB・CCCが入っていてタブが移動するたびに動的に中身を変えています。 21 let url = URL(string: "https://hogehoge.com/" + self.stateMenu + "/" + val) 22 23 //URL化 24 let urlRequest = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 0) 25 26 switch self.stateMenu { 27 case "AAA": 28 self.options.pv1.赤IBoutlet.load(urlRequest) 29 break 30 case "BBB": 31 self.options.pv2.青IBoutlet.load(urlRequest) 32 break 33 } 34 } 35}

めちゃくちゃザックリですが、上記でやりたい事が出来ました。
日々精進いたします。

投稿2019/08/16 02:50

ludolf

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問