0

これはxcode 10.3、swift 5にあります

WKWebView を使用して Web コンテンツを読み込もうとしています。WKNavigationDelegate クラスを実装する NSObject だけのクラスがあります。

  • Web ビューを作成します
  • ナビゲーションデリゲートを設定する
  • Web ビューを読み込む

この関数を含める場合: (何でも許可)

    public func webView(_ webView: WKWebView,
                        decidePolicyFor navigationAction: WKNavigationAction,
                        decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        decisionHandler(.allow)
        return
    }

ページは空の html 本文をロードするだけで、何も表示されません。また、関数がこの方法で呼び出されることはありません。

その関数をコメントアウトすると、ページは正常に読み込まれます。

私は困惑しています!

webview を含むクラスを UIViewController に変更してから、それをメインコントローラーに追加しようとしました。そうすることで、決定ハンドラー関数が呼び出されますが、私の webview はまだ空です。(about:blank のみを要求します)

// simplified code

public class MyClass : NSObject, WKUIDelegate, WKNavigationDelegate {
    public func load(container:UIView){
        let config = WKWebViewConfiguration()
        config.allowsInlineMediaPlayback = true
        config.mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypes.init(rawValue: 0)

        webView = WKWebView(frame:CGRect(x:0, y:0, width:250, height:250), configuration: config) // test rectangle
        webView!.navigationDelegate = self
        webView!.uiDelegate = self
        webView!.isUserInteractionEnabled = true
        container.addSubview(webView!)

        let body = "<div>test</div>"
        webView!.loadHTMLString(body, baseURL:URL(string:"MY_SITE_HERE"))
    }

    public func webView(_ webView: WKWebView,
                        decidePolicyFor navigationAction: WKNavigationAction,
                        decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {

        decisionHandler(.allow)
        return
    }
}


これがどのように発生するか: 私のメイン ビュー コントローラーには NSObject のインスタンスがあり、次のように簡略化されています。


class SDKConsumer : NSObject {

init(parentViewController:ViewController) {
        self.parentViewController = parentViewController
        super.init()
    }

func myFunction(){
        let instance = MyClass()

        instance.load(container:parentViewController!.view)
    }
}
4

1 に答える 1

1

メモリ管理に問題があります。MyObjectインスタンスへの強い参照をどこにも保持していません。強い参照がないためmyFunction、終了するとすぐにインスタンスは消えます。MyObject

ローカルinstance変数の代わりにプロパティを作成すると、問題が解決するはずです。

于 2019-07-26T00:50:40.247 に答える