Objective c 未调用UIWebView webViewDidStartLoad
我发布此消息是因为我没有找到任何答案 我将请求发送到我的Objective c 未调用UIWebView webViewDidStartLoad,objective-c,uiwebview,Objective C,Uiwebview,我发布此消息是因为我没有找到任何答案 我将请求发送到我的UIWebView,webviewdidstartoad未被调用。我需要使用重新加载的方法,然后它就会工作。顺便说一下,shouldStartLoadWithRequest会被调用两次 如果我使用一个测试url(比如说Google),我不会遇到任何问题。所以它似乎不是来自我的代码 但在这里,我给一个丑陋的网站打电话,它使用了很多有棱角的JS(我不知道它是如何制作的)。奇怪的是,它在Safari上运行得很好 我不明白的是,它只是“卡在”sho
UIWebView
,webviewdidstartoad
未被调用。我需要使用重新加载的方法,然后它就会工作。顺便说一下,shouldStartLoadWithRequest
会被调用两次
如果我使用一个测试url(比如说Google),我不会遇到任何问题。所以它似乎不是来自我的代码
但在这里,我给一个丑陋的网站打电话,它使用了很多有棱角的JS(我不知道它是如何制作的)。奇怪的是,它在Safari上运行得很好
我不明白的是,它只是“卡在”shouldStartLoadWithRequest
中。但在没有回调之后。什么也没有发生,甚至(didFailLoadWithError:
)。
有什么想法吗
***编辑******
好的,我发现了问题,但这仍然是一个奇怪的相关问题。我已经找到了向您发送代码的解决方案,但我不敢相信代码真的起作用了
事实上,当我的web视图被隐藏时,我正在调用http请求,我不知道为什么,第二个调用永远不起作用。你不能复制这个“bug”,因为这个网站是沙盒的,我已经在谷歌上测试过了,这很有效
您需要知道,我测试过的站点使用了大量基于GUI状态的angular JS。如果有人仍然可以解释uiwebview如何从服务器端卡住(webViewDidStartLoad从未调用),我会很高兴。因此,该漏洞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
@界面视图控制器()
@属性(非原子,保留)UIWebView*webview;
@结束
@实现视图控制器
@综合网络视图=_网络视图;
#pragma标记-UIWebViewDelegate
-(BOOL)webView:(UIWebView*)webView
shouldStartLoadWithRequest:(NSURLRequest*)请求
导航类型:(UIWebViewNavigationType)导航类型{
返回YES;
}
-(void)webView加载:(UIWebView*)webView{
//对于那个丑陋的网站,如果_webview.hidden设置为true,它将永远不会被调用。
}
#pragma标记-生命周期
-(无效)viewDidLoad{
[自设置网络视图];
//第一次,它会起作用。
[自执行选择器:@选择器(loadUrlString:)withObject:@”http://theUglySite.com“延迟后:1];
//现在,如果uiwebview被隐藏,则没有响应。
[自执行选择器:@选择器(loadUrlString:)withObject:@”http://theUglySite.com“延迟后:3];
[超级视图下载];
}
#pragma标记逻辑
-(无效)setUpWebView{
self.webview=[[UIWebView alloc]initWithFrame:(CGRect){0,0320480}]autorelease];
_webview.delegate=self;
//隐藏webView将中断委托回调。这在正常情况下仍然有效
//请求。
_webview.hidden=是;
[self.view addSubview:_webview];
}
-(void)loadUrlString:(NSString*)urlString{
NSURL*url=[NSURL URLWithString:urlString];
NSURLRequest*request=[nsurlRequestRequestWithURL:url];
[_webviewloadrequest:request];
}
@结束
显然,ios中的webview专门检查html的dom中的“iframe”标记,如果找到,它也会基于该标记创建事件。因此,一个简单但不完整的解决方案是在正在更改的dom部分(例如,在每个部分的实际模板中)添加以下代码:
为我做了这个把戏。。我也在使用angularjs 1.3.16版你能分享你的代码吗?你在
.h
文件中实现了UIWebviewDelegate
吗?@AkshitZaveri如果他没有实现UIWebviewDelegate
它将永远不会调用webviewDidStartLoad
并且应该加载请求:
。因此,如果它最终成功地实现了这些方法,那么必须实现这一点。您是否在主线程上调用了请求?是的,代码正在主线程上运行。我的代码适用于每个普通URL。但是当它是那个(糟糕的)站点时,我需要调用[webView reload]来实现它,但是委托调用会被调用两次。如果我不这样做,什么也不会发生
<iframe></iframe>