gpt4 book ai didi

ios - 从后台获取加载 UIWebView

转载 作者:可可西里 更新时间:2023-11-01 01:44:20 25 4
gpt4 key购买 nike

我在我的应用程序中使用 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 委托(delegate)方法。我认为这可能与这一行有关:

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")
}
}

最佳答案

下面是一个示例,说明如何将 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 的委托(delegate)方法来告诉您 UIWebView 何时完成加载。我将错误委托(delegate)方法作为奖励包括在内。

这里的示例使用的是 UIActivityIndi​​catorView 类,它专为异步任务而设计。通过遵循相同的实现风格,您可以将 activityIndi​​cator 替换为几乎任何您计划对 UIWebView 的结果采取务实行动的东西。

祝你好运

更新

Swift 是另一种野兽。您的 swift 类(class)中有很多错误。这就是我如何用 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")
}

}

关于ios - 从后台获取加载 UIWebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24521805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com