将页面加载到 webview swift 2 来自 java class

Load page into webview swift 2 from java class

我正在使用 Xwebview 为 iPhone 开发一个应用程序,它使我能够下载一个页面,然后在下载的页面上与 javascript 进行交互。 一切正常,但如果互联网连接断开,则会加载默认本地页面,通知用户没有互联网连接。该页面显示一个重试按钮,按下该按钮会检查互联网连接:如果建立连接,应用程序会尝试再次连接到外部页面并将该页面加载到 webview 中。 我无法让它工作:代码下载页面(我可以在我的会话数据中看到它)但我无法将该页面加载回网络视图。

override func viewDidLoad() {
        super.viewDidLoad()
              login()
        }

    func login()
    {
        // *********** Get stored hashkey **************
        let hashcode = getHashcode()

        // ********** Check network connection *********
        let netConnection = Connection.isConnectedToNetwork()
        print("net connection: ", netConnection)

        if netConnection == true
        {
            if hashcode != "00000"
            {

                print("local key found", hashcode)
                // We dont have local key
                let webview = WKWebView(frame: view.frame, configuration: WKWebViewConfiguration())
                //webview.loadRequest(NSURLRequest(URL: NSURL(string: "about:blank")!))
                view.addSubview(webview)
                webview.loadPlugin(jsapi(), namespace: "jsapi")


                let url:NSURL = NSURL(string: serverLocation + onlineLoginApi)!
                let session = NSURLSession.sharedSession()
                let request = NSMutableURLRequest(URL: url)

                request.HTTPMethod = "POST"
                request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

                let paramString = "/?username=username&password=password"
                request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding)

                let task = session.downloadTaskWithRequest(request) {
                    (
                    let location, let response, let error) in

                    guard let _:NSURL = location, let _:NSURLResponse = response  where error == nil else {
                        print("error")
                        return
                    }

                    let urlContents = try! NSString(contentsOfURL: location!, encoding: NSUTF8StringEncoding)

                    guard let _:NSString = urlContents else {
                        print("error")
                        return
                    }

                    print(urlContents)

                }

                task.resume()

                // you must tell webview to load response
                webview.loadRequest(request)

            }
            else{

                print("local key found", hashcode)
                // ********* Found local key go to site pass key over ************

                let webview = WKWebView(frame: view.frame, configuration: WKWebViewConfiguration())
                view.addSubview(webview)
                webview.loadPlugin(jsapi(), namespace: "jsapi")

                let req = NSMutableURLRequest(URL: NSURL(string:serverLocation + onlineLoginApi + "?hashcode=\(hashcode)")!)
                req.HTTPMethod = "POST"
                req.HTTPBody = "/?hashcode=\(hashcode)".dataUsingEncoding(NSUTF8StringEncoding)
                NSURLSession.sharedSession().dataTaskWithRequest(req)
                { data, response, error in
                    if error != nil
                    {
                        //Your HTTP request failed.
                        print(error!.localizedDescription)
                    } else {
                        //Your HTTP request succeeded
                        print(String(data: data!, encoding: NSUTF8StringEncoding))
                    }
                    }.resume()
                webview.loadRequest(req)

            }

        }
        else{

            // No connection to internet

            let webview = WKWebView(frame: view.frame, configuration: WKWebViewConfiguration())
            view.addSubview(webview)
            webview.loadPlugin(jsapi(), namespace: "jsapi")

            let root = NSBundle.mainBundle().resourceURL!
            let url = root.URLByAppendingPathComponent("/www/error-no-connection.html")
            webview.loadFileURL(url, allowingReadAccessToURL: root)
            print("No internet connection")

            }
    }
class jsapi: NSObject {


        // Reconnect button on interface
        func retryConnection()
        {
            print("Reconnect clicked")
            dispatch_async(dispatch_get_main_queue())
            {
            let netConnections = Connection.isConnectedToNetwork()

                if netConnections == true {
                let netalert = UIAlertView(title: "Internet on line", message: nil, delegate: nil, cancelButtonTitle: "OK")
                netalert.show()

                let url = self.serverLocation + self.onlineLoginApi
                let hashcode = ViewController().getHashcode()

                if(hashcode != "00000") {
                    let url = url + "?hashcode=\(hashcode)"
                    print("url: ", url)
                }

                   ViewController().loadPagelive(url)

                }


            else{
                let netalert = UIAlertView(title: "Internet off line", message: nil, delegate: nil, cancelButtonTitle: "OK")
                netalert.show()
                }
            }
            print("retryConnect end")
            }
        }

您尝试在 ViewController 的新实例上执行 loadPagelive(url),而不是在屏幕上显示的当前实例上,这就是您看不到任何更新的原因。

您应该创建委托或完成块以便在您身上执行代码 ViewController 实例加载到屏幕上:每次您这样做 ViewController(),都会创建一个新对象。

你可以试试委托模式,实现简单。我将尝试专注于重要部分并创建可与您现有代码一起使用的内容:

class ViewController: UIViewController {
    let jsapi = jsapi() // You can use only 1 instance

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set your ViewController as a delegate, so the jsapi can update it
        jsapi.viewController = self
        login()
    }

    func loadPagelive(_ url: URL) {
        // Load page, probably you already have it
    }
}

class jsapi: NSObject {
    weak var viewController: ViewController?

    func retryConnection() {
       // We check if the delegate is set, otherwise it won't work
       guard viewController = viewController else {
           print("Error: delegate not available")
       }

       [... your code ...]

       // We call the original (and hopefully unique) instance of ViewController
       viewController.loadPagelive(url)
    }
}