54451


Swiftの各タブ内にWKWebViewを生成するWebViewアプリを開発しています。  
UINavigationControllerとUITabBarControllerを併用していて、上部に共通のヘッダーがあります。  
各タブにはそれぞれWKWebViewでWebページを設置していて、Webページ内で違うページに遷移すると上部のヘッダーに戻るボタンを追加します。（アクティブタブが変わればそのWebViewに戻るボタンが必要かどうか判断しています）

Tab毎のViewController内でWebViewが戻るメソッドを用意しています。

[code]

    class Tab1ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
        var webView: WKWebView!
        ....
        public func webViewGoBack() {
            webView.goBack()
        }
    }
    
[/code]

UITabBarControllerのクラス内で戻るボタンが押された時のActionを設定しています。

[code]

    class TabsViewController: UITabBarController {
        @IBAction func webViewGoBackBtn(_ sender: UIBarButtonItem) {
            Tab1ViewController().webViewGoBack()
        }
    ....
    
[/code]

アプリはビルドできるのですが、実際にヘッダーのボタンを押してwebViewGoBackを実行するとXcodeで以下のエラーが表示されてアプリがクラッシュします。

[code]

    Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
    
[/code]

Tab1ViewController内でwebViewGoBack()を実行した時は正常に動きました。  
修正方法または解決方法を教えて頂けると助かります。


CC BY-SA 4.0
2019-04-23T15:59:27.253
54440
2019-04-24T08:15:55.813
33047
question
swift wkwebview
Swiftで外部クラスからWKWebViewを操作したい


ソース全体が質問に書かれていないので、確実なことは言えませんが、提示されたソースの`@IBAction`部で

[code]

    Tab1ViewController().webViewGoBack()
    
[/code]

としておられますが、これでは、Tab1ViewControllerを新規に作成し、それに`webViewGoBack`というメソッドを発行していますね。  
これでは、作られたての`Tab1ViewController`のインスタンス内の操作すべき`WKWebView`にはまだなにも入っていない(=`nil`)ので、`public
func webViewGoBack()`内部の

[code]

    webView.goBack()
    
[/code]

の`webView`は、まだ`nil`のため出るエラーと思われます。

対応としては、`TabsViewController`の初期化でメンバー変数に`Tab1ViewController`のインスタンスを保存しておき、（当然その中の`webView`も値がちゃんと入る様にし、そのメンバーに対して`webViewGoBack()`メソッドを実行することだと思います。  
なので、`Tab1ViewController`の内容は、必要な部分だけ記述しますが

[code]

    class TabsViewController: UITabBarController {
        let tab1: Tab1ViewController = Tab1ViewController()
    
        override func viewDidLoad() {
            // tab1の設定が必要であればここで行う
        }
    
        @IBAction func webViewGoBackBtn(_ sender: UIBarButtonItem) {
            tab1.webViewGoBack()
        }
    }
    
[/code]

と、なるべきだと思います。


CC BY-SA 4.0
2019-04-24T08:15:55.813
54451
2019-04-24T08:15:55.813
14745
54440
answer