1

Objective-C では、次のコードが で機能しviewDidLoadます。

[self.myWebView performSelectorOnMainThread:
@selector(stringByEvaluatingJavaScriptFromString:)
withObject:@"alert('Test')" waitUntilDone:NO];

このコードは、次のように提案されています。

UIWebView stringByEvaluatingJavaScriptFromString は、GCD を使用して呼び出すと、iOS5.0/5.1 でハングします。

performSelectorOnMainThreadで動作すると言われていstringByEvaluatingJavaScriptFromStringます。これにより警告ダイアログが表示され、[OK] ボタンをクリックして閉じることができます。ただし、dispatch_async動作せず、ダイアログがフリーズし、[OK] ボタンを押すことができません。

問題は、上記のダイアログ機能を Swift で機能させる方法です。コードを Swift に変換する方法は?

問題はperformSelectorOnMainThread、Objective-C で使用されているものが Swift で使用できないことです。

で以下のコードを直接呼び出すとviewDidLoad、デバイスは LaunchScreen で一時停止されます。

override func viewDidLoad() {
    super.viewDidLoad()
    myWebView.stringByEvaluatingJavaScriptFromString("alert('test')");

代替ソリューションを試しましたperformSelectorOnMainThreadが、結果は起動画面がフリーズするか、警告ダイアログがフリーズします。

stringByEvaluatingJavaScriptFromStringSwift で JavaScript 警告ダイアログを表示するために呼び出す方法を教えてください。ありがとうございました。

4

1 に答える 1

2

Web ページを読み込んで を呼び出すことstringByEvaluatingJavaScriptFromStringで、この問題を解決しましたwebViewDidFinishLoad

解決策は次のとおりです。

import UIKit

class ViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet weak var myWebView: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        var myPath = NSBundle.mainBundle().pathForResource("index", ofType: "html")
        myWebView.delegate = self
        myWebView.loadRequest(NSURLRequest(URL: NSURL(string: myPath!)!))
    }

    func webViewDidFinishLoad(webView: UIWebView) {
        myWebView.stringByEvaluatingJavaScriptFromString("alert('Hello')")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
于 2015-07-01T13:31:48.780 に答える