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

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

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

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

Swift

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

Q&A

解決済

2回答

3125閲覧

[Swift4] 別のクラスから、reloadメソッド呼び出したい

teshiya

総合スコア8

iOS

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

Swift

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

0グッド

1クリップ

投稿2017/12/20 05:33

Main, SubのViewControllerが2つあり、MainにおいてWebView(UIWebView)を利用しています。
やりたいこととしては、Sub側のボタンを押したら、MainのWebViewがリロードされるようにしたいです。

Swift

1class Main: UIWebViewController, UIWebViewDelegate { 2 @IBOutlet weak var webView: UIWebView! 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 self.webView.delegate = self 7 } 8: 9: 10 func reloadPage() { 11 self.webView.reload() 12 } 13: 14: 15}

swift

1class Sub: UIWebViewController { 2: 3: 4 @IBAction func reload(_ sender: Any) { 5 // ここでMainのreloadPage()を呼びたい 6  }

Sub側で、Mainをインスタンス化してしまうと、reloadPage()でwebViewがnilとなってしまい実行時にエラーとなってしまいます。
reloadPage()をstatic化すると、今度はreloadPage()でself.webView.reload()が呼べません。

まだSwiftに慣れておらず、基礎的な理解が足りていないことは重々承知しておりますが、よい方法がございましたらご教示いただければ幸いです。

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

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

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

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

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

fuzzball

2017/12/20 05:36

MainとSubの関係は?MainのインスタンスをSubに渡せばいいのですが、何か思いつく方法はありませんか?
teshiya

2017/12/20 06:42

いろいろ省略してしまいましたが、今回のアプリではSlideMenuControllerSwiftライブラリを利用して、いわゆるメニュー画面を表示しています。Main画面でスワイプすると左側にメニュー画面(Sub)が表示される仕組みです。このメニューにてリロードボタンがあり、ボタンを押すとMainのWeb画面をリロードしたいのです。
guest

回答2

0

SlideMenuControllerSwiftをご利用とのことであれば、一時的にABどちらの画面も見えているように思いますが、アクティブな画面はどちらか一方です。
ですので、

Sub側で、(1)リロードする何かを伝え、(2)Mainに制御を渡す、(3)制御を受け取ったMain側はリロードするかどうかを判断するという流れになります。

SubからMainのreloadをするのではなく、あくまでMainが自身のreloadを行う。

1)リロードする状態をMainに伝える方法
UserDefaultsを利用するか、delegateを利用するか、Mainインスタンスを経由してMainのメンバ変数に設定するとかでしょうか。
2) openLeftとかopenRightとかでMainに
3) 1に応じて、leftDidCloseとかrightDidCloseあたりでリロードか否かを判断して、self.webView.reload() を呼ぶ。

投稿2017/12/20 08:11

t_obara

総合スコア5488

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

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

fuzzball

2017/12/20 08:27

「アクティブな画面はどちらか一方です」が、どういう意味・意図なのか分かりませんが、Subが上にある状態(下にMain)でMainのテーブルを更新すると、その状態でMainの画面は更新されますよ。
t_obara

2017/12/21 04:42

fazzballさん>ご指摘ありがとうございます、どうも思い込みをしていたようです。勉強になりました、精進したいと思います。 提示されたサンプルコードを見ると、MainもSubもどちらもSlideMenuControllerからの派生ではないため、SlideMenuControllerが保有するメンバとして利用していると推測されます。したがって、MainとSubが明示的な親子関係ではないです。そのため、「アクティブな画面はどちらか一方です」と表現しましたが、その場合だとしてもSubからの指示でMain(のUI部品)が更新されるのですよね。 さて、Mainが一つであれば、MainをSlideMenuControllerにすれば十分と思われますが、Subがメニューとなり、実はMain1、Main2、、を切り替えて動作させるということであれば、現状で良いですし、その場合、delegateを用意して、そこで定義したメソッドを(Subから)呼び出すのが良さそうに思います。 個人的には、SlideMenuControllerDelegateの各メソッドのパラメータにsenderがあればもう少し楽ができたかもしれませんね。
guest

0

ベストアンサー

試せていませんが、
Subクラス内で、以下の様にSlideMenuControllerを経由してMainクラスが取得できないでしょうか。

swift

1if let slideMenuController = self.slideMenuController() { 2 if let main = slideMenuController.mainViewController as? Main { 3 // some 4 } 5}

GitHub - dekatotoro/SlideMenuControllerSwift
・「You can access from UIViewController」参照

投稿2017/12/20 07:27

dsuzuki

総合スコア1682

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

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

teshiya

2017/12/20 08:39

ありがとうございます、ご教示いただいた方法で、//someの箇所にmain.reloadPage()を実装したところ、コンパイルはOKでしたが、実行時にこの処理を通りませんでした…。
dsuzuki

2017/12/20 09:32

SlideMenuControllerがとれないのか、Mainがとれないのか。 SubにMainの変数(例えば、var main: Main?)を追加し、MainとSubのインスタンスを生成したとき(多分、SlideMenuControllerに対して、mainControllerとleftControllerを設定したとき)に、sub.main = main とすればいいのではないでしょうか。 Sub内でMainのインスタンスを作成しても、SlideMenuControllerのmainControllerに設定したMainとは別物のはずですから。
teshiya

2017/12/21 02:32

Mainのインスタンス化をヒントに、mainをstatic化する事でsubからmainの関数(reloadPage)を呼ぶことができました。 ベストな実装ではないかもしれませんが、ひとまず想定通りの挙動になりました。ありがとうございました。
fuzzball

2017/12/21 04:13

dsuzukiさんのコードでうまくいくはずなので、変なことをせずに解決した方がいいと思いますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問