从后台提取加载UIWebView

时间:2014-07-02 02:04:00

标签: ios uiwebview swift

我在我的应用程序中使用UIWebView来加载网站的内容。然后我使用javascript登录网站,然后在我登录后解析页面内容以获取我需要的数据。我每5分钟做一次,在前台工作正常。但是,当我对应用程序进行后台处理时,我调用了保存UIWebView的UIViewController,然后点击了将URL加载到UIWebView中的方法,但之后没有任何反应。

我很确定UIViewController必须处于活动状态才能更新UIWebView,但有没有解决方法呢?在后台检查这些数据实际上是应用程序的重点。

修改

jakepeterson - 基于您的代码,我尝试从Swift开始子类化UIWebView。这是我得到的:

    class CustomWebView: UIWebView, UIWebViewDelegate
{
    var webView: UIWebView
    var requestURL: NSURL
    var urlRequest: NSURLRequest

    init()
    {
        webView = UIWebView()
        requestURL = NSURL(string: "http://www.google.com")
        urlRequest = NSURLRequest(URL: requestURL)

        super.init(frame: CGRectMake(0, 0, 100, 100))
        webView.delegate = self
        webView.addSubview(webView.window)
        webView.loadRequest(request)
    }

    func webViewDidFinishLoad(sender: UIWebViewDelegate)
    {
        //Do stuff
    }
}

我仍然没有点击webViewDidFinishLoad委托方法。我认为这可能与这一行有关:

webView.addSubview(webView.window)

在您的代码中,您拥有self.view但不会显示为可用选项。

更新

以下是我现在正在做的事情,代表现在正在被触发:

import UIKit

class CustomWebView: UIWebView
{
    var uiView = UIView()

    init(frame: CGRect)
    {
        super.init(frame: frame)
        self.delegate = self
    }

    convenience init(frame:CGRect, request:NSURLRequest)
    {
        self.init(frame: frame)
        uiView.addSubview(self)
        loadRequest(request)
    }    
}

extension CustomWebView: UIWebViewDelegate
{
    func webViewDidStartLoad(webView: UIWebView!)
    {
        println("webViewDidStartLoad")
    }

    func webViewDidFinishLoad(webView: UIWebView)
    {
        println("webViewDidFinishLoad")
    }

    func webView(webView: UIWebView!, didFailLoadWithError error: NSError!)
    {
        println("An error occurred while loading the webview")
    }
}

2 个答案:

答案 0 :(得分:2)

以下是如何使用异步逻辑客观地使用UIWebView类的示例:

- (id)init
{
    self = [super init];
    if (self)
    {
        self.webView = [[UIWebView alloc] init];
        self.webView.delegate = self;
        [self.view addSubview:self.webView];

        self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        [self.view addSubview:self.activityIndicator];
    }

    return self;
}

- (id)initWithUrl:(NSURL *)url
{
    self = [self init];
    if (self)
    {
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [self.webView loadRequest:request];
        [self.activityIndicator startAnimating];
    }

    return self;
}

#pragma mark - UIWebViewDelegate

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self.activityIndicator stopAnimating];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [self.activityIndicator stopAnimating];

    NSLog(@"An error occurred while loading. (error: %@)", error);

    // Alert the user
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Oops" message:@"Dude... we messed up. This web page can't be loaded at this time." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
}

为什么这样做?

因为您依赖于UIWebViewDelegate的委托方法来告诉您UIWebView何时完成加载。我将错误委托方法作为奖励。

此处的示例使用UIActivityIndicatorView类,该类旨在用于异步任务。通过遵循相同的实现样式,您可以将activityIndicator替换为您计划用UIWebView实际操作的结果的几乎任何内容。

祝你好运

<强>更新

斯威夫特是另一头野兽。你的快速课程中有很多错误。这就是我如何重写我最初在Swift的ObjC中给你的东西:

import UIKit

class CustomWebView: UIWebView {

    var activityIndicator:UIActivityIndicatorView

    init(frame: CGRect) {
        self.activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
        super.init(frame: frame)
        self.delegate = self
    }

    convenience init(frame:CGRect, request:NSURLRequest) {
        self.init(frame: frame)
        loadRequest(request)
    }

}

extension CustomWebView: UIWebViewDelegate {

    func webViewDidFinishLoad(webView: UIWebView) {
        self.activityIndicator.stopAnimating()
    }

    func webView(webView: UIWebView!, didFailLoadWithError error: NSError!) {
        self.activityIndicator.stopAnimating()

        println("An error occurred while loading the webview")
    }

}

答案 1 :(得分:0)

看起来我发现将控件添加到UIView以使代表触发的技巧只能在前台工作。因此,对于检查此问题的任何人来说,目前似乎没有办法在后台执行此操作。