未调用UIWebView webViewDidStartLoad

时间:2013-10-14 13:42:57

标签: objective-c uiwebview

我发布此邮件是因为我没有找到任何答案。

我向UIWebView发送了一个请求,但未调用webViewDidStartLoad。我需要使用方法reload,然后它会工作。顺便说一下,shouldStartLoadWithRequest被调用两次。

如果我使用的是测试网址(比如Google),我不会遇到任何问题。所以它似乎不是来自我的代码。

但是在这里,我正在调用一个使用大量角度JS的丑陋网站(我不知道它是如何制作的)。奇怪的是,它在Safari上运行良好。

我不明白的是它只会在shouldStartLoadWithRequest中被“卡住”。但没有回调。什么都没发生,甚至(didFailLoadWithError:)。 有什么想法吗?

** * 编辑 * ** * *

好的,我发现了问题,但这仍然是一个奇怪的相关问题。我发现解决方案试图向您发送代码,我无法相信代码实际上正在运行。

事实是,当我的网页视图被隐藏时,我正在调用http请求,而我不知道为什么,第二个调用永远不会正常工作。您无法重现“错误”,因为该网站是沙盒,并且我已在Google上进行过测试,这样可行。

你需要知道我测试的网站使用了很多基于GUI状态的角度JS。如果有人仍然可以解释我怎么能从服务器端(从未调用webViewDidStartLoad)阻止uiwebview,我会很高兴。所以这个bug与100%服务器有关。

这里是代码:

@interface ViewController ()<UIWebViewDelegate>
@property(nonatomic, retain)UIWebView* webview;
@end

@implementation ViewController
@synthesize webview = _webview;

#pragma mark - UIWebViewDelegate

- (BOOL)webView:(UIWebView *)webView
    shouldStartLoadWithRequest:(NSURLRequest *)request
    navigationType:(UIWebViewNavigationType)navigationType{    
    return YES;
}

- (void)webViewDidStartLoad:(UIWebView *)webView{
    // With that ugly site it will be never called if _webview.hidden is set to true.
}

#pragma mark - lifeCycle

- (void)viewDidLoad{
    [self setUpWebView];

    // first time, it will work.
    [self performSelector: @selector(loadUrlString:) withObject: @"http://theUglySite.com" afterDelay: 1];

    // now, if the uiwebview is hidden, no response.
    [self performSelector: @selector(loadUrlString:) withObject: @"http://theUglySite.com" afterDelay: 3];

    [super viewDidLoad];
}

#pragma mark - logic

- (void)setUpWebView{
    self.webview        = [[[UIWebView alloc] initWithFrame:(CGRect){0,0,320,480}] autorelease];
    _webview.delegate   = self;

    // hidding the webView will break the delegate callBack. That will still work on normal
    // urlRequest.
    _webview.hidden = YES;

    [self.view addSubview: _webview];
}

- (void)loadUrlString:(NSString*)urlString{
    NSURL* url = [NSURL URLWithString: urlString];
    NSURLRequest* request = [NSURLRequest requestWithURL: url];
    [_webview loadRequest: request];
}

@end

1 个答案:

答案 0 :(得分:0)

显然,ios中的webview专门检查html dom中的“iframe”标签,如果找到,它也会根据该标签创建事件。因此,一个简单但不完整的解决方案是在正在改变的dom部分添加以下代码(例如,在每个部分的实际模板中):

<iframe></iframe>

为我做了诀窍..我也使用angularjs版本1.3.16