标签: uiwebviewdelegate

UIWebViewDelegate:在页面内导航期间未调用webViewDidFinishLoad

我有一个应用程序,用户可以在其中导航一堆本地存储的HTML文件.我有一个UIWebView,正确配置了一个UIWebViewDelegate.通常,当用户跟随​​链接时,shouldStartLoadWithRequest会调用,之后会webViewDidFinishLoad稍后调用.

但是,如果链接指向与当前显示的链接相同的页面上的锚点,则仅shouldStartLoadWithRequest调用该链接.webViewDidFinishLoad不开火.

从某种意义上说,我发现这可能是预期的行为,因为页内导航不应该要求页面重新加载.但是,在页面导航完成后,我真的需要一个可以挂钩到调用堆栈的地方.当任何类型的导航结束时,最佳解决方案将让我知道,包括来自另一页面,页内和前进/后退动作.

到目前为止,我最好的解决方法是performSelector: withObject: afterDelay:在我的shouldStartLoadWithRequest方法结束时调用,但我对此并不满意.

有谁知道我怎么能正确解决这个问题?有任何见解赞赏!

navigation objective-c uiwebview ios uiwebviewdelegate

11
推荐指数
2
解决办法
5327
查看次数

UIWebView stringByEvaluatingJavaScriptFromString

我坚持要在我的UIWebView中运行一些非常基本的JS.在Web视图的委托中,我有:

- (void)webViewDidFinishLoad:(UIWebView *)wView {
    NSString *someHTML = [wView stringByEvaluatingJavaScriptFromString:@"document.getElementsByClassName('box')[0]"];   
    NSString *allHTML = [wView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
    NSLog(@"someHTML: %@", someHTML);
    NSLog(@"allHTML: %@", allHTML);
}
Run Code Online (Sandbox Code Playgroud)

但是当调用该方法时,someHTML为nil,而allHTML包含webview中HTML的整个主体.

我在Safari JS控制台中运行了JS,它运行得很好(它找到了一个类'box'的div,所以我知道它在HTML中)

有什么建议?

更多信息:

FWIW,导致以下各项也是零

NSString *result = [self.webView stringByEvaluatingJavaScriptFromString: @"document"];
NSLog (@"1. result: %@", result); //should log the document object?

result = [self.webView stringByEvaluatingJavaScriptFromString: @"document.body"];
NSLog (@"2. result: %@", result); //should log the document body

result = [self.webView stringByEvaluatingJavaScriptFromString: @"document.body.getElementsByClassName"];
NSLog (@"3. result: %@", result); //should log a function

result = [self.webView stringByEvaluatingJavaScriptFromString: @"document.body.getElementsByClassName('box')[0]"];
NSLog (@"4. …
Run Code Online (Sandbox Code Playgroud)

javascript iphone uiwebview uiwebviewdelegate

10
推荐指数
1
解决办法
3万
查看次数

在scrollview.contentsize中,UIWebView内容高度不准确

我正在尝试滚动到我在UIWebView中加载的pdf文档中的特定页面.我可以在iOS 5中使用以下方法执行此操作:

pageHeight = webView.scrollView.contentSize.height / numberOfPages;
[[webView scrollView] setContentOffset:CGPointMake(0,pageNumber*pageHeight) animated:YES];
Run Code Online (Sandbox Code Playgroud)

这仅在页面已经加载到视图中并且滚动到由用户操作触发时才有效.对于我想将新的pdf加载到webview到特定页面的情况,我遇到了麻烦.我正在请求加载新的pdf,然后在页面完成加载时执行以下操作:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    int contentHeight = myWebView.scrollView.contentSize.height;
    int pageHeight = contentHeight / 5; // 5 total pages in example PDF
    int scrollDelta = pageHeight*2; // Scroll forward 2 pages

    [[myWebView scrollView] setContentOffset:CGPointMake(0,scrollDelta) animated:YES];
}
Run Code Online (Sandbox Code Playgroud)

虽然myWebView.scrollView.contentSize.height是完整文档高度,当我在初始文档加载后单击按钮时运行类似代码时,当我加载新文档并且webViewDidFinishLoad触发myWebView.scrollView.contentSize.height等于高度时UIWebview,而不是其中的内容.这当然使pageHeight比它需要的小很多,并且不会滚动到正确的位置.

webWeDidFinishLoad认为可能页面还没有完全加载,即使我收到了回调,但是我已经尝试过像延迟滚动代码一样的黑客攻击,但是在那些情况下,contentSize.height由于某种原因是0.

任何想法将不胜感激.

谢谢!

pdf scroll uiwebview uiwebviewdelegate ios5

9
推荐指数
1
解决办法
2280
查看次数

如何查找UIWebView的最后一次加载(Ready State 4)

我有一个问题的didFinishLoad方法UIWebView是继续射击.我想尝试一下estimatedProgress 解决方案,但不幸的是我不知道在哪里找到这些框架.我正在运行Mountain Lion并使用最新版本的XCode.此外,对于多次触发的UIWebView,这是最好的方法还是有新的方法.似乎有关于SO 的javascript 答案,但这对我不起作用.这可追溯到2009年,我听说苹果公司拒绝任何使用私有API的应用程序.请帮帮我吧!

谢谢大家!

xcode uiwebview ios uiwebviewdelegate

9
推荐指数
1
解决办法
1406
查看次数

UIWebView不会加载URL,iOS

我正在尝试在应用启动时加载网址.

我拖动了一个UIWebView对象,在我的.nib上,我创建了一个属性插座,我将它连接到webview,在我的视图控制器中,我放置了以下代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *fullURL = @"http://google.com";
    NSURL *url = [NSURL URLWithString:fullURL];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];
}
Run Code Online (Sandbox Code Playgroud)

然而,我只是在设备上得到一个黑屏,就像没有任何视图.任何的想法?

uiwebview ios uiwebviewdelegate

9
推荐指数
1
解决办法
2万
查看次数

如何检查UIWebView是否为空

我需要检查完成加载时的webview是否有任何内容.

我需要的是简单的.它是我页面底部的一个小网页视图(如广告)

我打电话

NSURLRequest *request=[NSURLRequest requestWithURL:adURL];
[gWebView loadRequest:request];
Run Code Online (Sandbox Code Playgroud)

我得到了回调

-(void)webViewDidFinishLoad:(UIWebView *)webView {
Run Code Online (Sandbox Code Playgroud)

但在我的场景中,webview将返回空,有时它将有数据.

如果我的服务器php文件没有返回任何内容,我不想显示webview.

如何验证我在回调(或任何其他方式)中收到空页?

uiwebview ios uiwebviewdelegate

8
推荐指数
2
解决办法
6500
查看次数

如何让UIWebView专注于表单输入并调出键盘?

我创建了一个UIWebView,用于登录Facebook的Graph API OAuth界面.这很好用,但我必须点击第一个输入字段才能弹出键盘.理想情况下,只要表单出现,键盘就会出现.所以我一直在试图弄清楚如何使第一个表单字段从webViewDidFinishLoad:UIWebViewDelegate方法获得焦点,如下所示:

- (void)webViewDidFinishLoad:(UIWebView *)wv {
    [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByName('email')[0].focus();"];
}
Run Code Online (Sandbox Code Playgroud)

唉,这不起作用.奇怪的是,当我在Firefox JavaScript控制台中运行JavaScript时,它确实将焦点移到了电子邮件字段.然而,当我在Safari for Mac中运行它时,它什么也没做,就像在iOS上一样.FWIW alert(document.getElementsByName('email')[0]) 确实显示它选择了一个HTMLInputElement.那么为什么focus()在iOS或Mac OS X 中什么都不做?

javascript safari focus uiwebview uiwebviewdelegate

7
推荐指数
1
解决办法
9332
查看次数

UIWebView和超时

我用a UIWebView来显示一些内容.在此内容中,用户可以浏览使用AJAX加载的一堆站点.这个网站上的一步需要相当长的一段时间.因为我没有找到关于timeoue的任何内容,UIWebView所以我试图在初始NSURLRequest加载时设置它.

不幸的是,这似乎没有做任何事情.我不太确定我是否应该自己设置超时?有什么我想念的吗?是否UIWebView重写我的超时?我对此有点困惑所以任何帮助都会受到赞赏.:)

最好的
-f

更新

我建立了一个测试项目来验证关于UIWebView超时工作方式的"理论" .这是设置:

  • 一个名为sleep.php的PHP文件,它有一个参数,我可以用它来配置睡眠时间直到它发送结果
  • 一个带有单个视图的Xcode项目,它是一个加载sleep.php的webView,如下所示:

    NSURLRequest*request = [NSURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:10]; [webView loadRequest:request];

因此,在使用秒参数时,我可以看到UIWebView它应该正常工作.我得到webViewDidFinishLoad:webView:didFailLoadWithError:取决于超时.

在验证了timeoutInterval所宣传的工作之后,我引入了proxy.php(它有两个指向sleep.php配置为5和15秒的链接),以查看我的请求配置是否仍然对新请求有效.我更改了初始化NSURLRequest以使用proxy.php,但是为超时留下了10秒的配置.

当我现在启动应用程序时,正在显示两个链接.当我点击第一个时,它会在5秒后按预期加载.不幸的是,第二个链接也会在15秒后加载.

所以我第一次尝试重新配置NSURLRequest就是改变它webView:shouldStartLoadWithRequest:navigationType:.不幸的是,Web服务使用AJAX,因此不会调用委托方法.

还有其他建议吗?有没有办法全局配置整体的超时值UIWebView

最好的
-f

iphone cocoa-touch timeout uiwebview uiwebviewdelegate

7
推荐指数
1
解决办法
9899
查看次数

iOS 5中的新错误:WebKit丢弃了未捕获的异常

我正在尝试UIWebView使用Facebook OAuth授权URL 加载,我使用以下代码.当我UIWebView加载Facebook登录页面时,我输入我的凭据,然后按"登录"按钮.当我按下按钮时,我收到以下错误:

WebKit在webView中丢弃了一个未捕获的异常:decisionPolicyForNavigationAction:request:frame:decisionListener:delegate:Application试图以模态方式呈现一个活动的控制器.

这个相同的代码适用于iOS 4.3和以前的版本,但它在iOS 5.0中不起作用.我不明白这个问题,有人可以帮帮我吗?

NSString *redirectUrlString = @"http://www.facebook.com/connect/login_success.html";
NSString *authFormatString = @"https://graph.facebook.com/oauth/authorize?client_id=%@&redirect_uri=%@&scope=%@&type=user_agent&display=touch";

NSString *urlString = [NSString stringWithFormat:authFormatString, _apiKey, redirectUrlString, _requestedPermissions];
NSURL *url = [NSURL URLWithString:urlString];

NSLog(@"NSURL: %@", urlString);

NSURLRequest *request = [NSURLRequest requestWithURL:url];
[_webView loadRequest:request];
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c uiwebview ios uiwebviewdelegate

7
推荐指数
1
解决办法
1万
查看次数

永远不会调用shouldStartLoadWithRequest

我已经研究过并且仍然不明白为什么从未调用过StartLoadWithRequest.我的页面加载正常,并调用了一些UIWebview委托协议方法.请从以下代码中找到相关的摘要:

在我的.m中合成我的webview(在头文件中定义):

@implementation PortViewController

@synthesize WebView = myWebView;
Run Code Online (Sandbox Code Playgroud)

我成功加载了我的webview:

    myURLString = [NSString stringWithFormat:@"https://%@", defaultWebsite];

    myURL = [NSURL URLWithString: myURLString];
    NSURLRequest *myRequest = [NSURLRequest requestWithURL:myURL];
    [myWebView loadRequest:myRequest];
Run Code Online (Sandbox Code Playgroud)

把我的代表设置为自我

- (void)viewDidLoad
{


[super viewDidLoad];
[myWebView setOpaque:NO];
[myWebView setBackgroundColor:[UIColor clearColor]];

//myWebView.description.

myWebView.delegate = self;
}
Run Code Online (Sandbox Code Playgroud)

我的所有协议方法都被称为EXCEPT shouldStartLoadWithRequest

- (void)webViewDidStartLoad:(UIWebView *)myWebView {
    [activityIndicator startAnimating];
}

- (void)webViewDidFinishLoad:(UIWebView *)myWebView {
    [activityIndicator stopAnimating];
}

- (BOOL)WebView:(UIWebView *)myWebView shouldStartLoadWithRequest:(NSURLRequest *)request          navigationType:(UIWebViewNavigationType)navigationType {

NSLog(@"inside Webview");
if([[request.URL absoluteString] hasPrefix:@"http://www.nzx"]) {
    // do stuff
    NSLog(@"Have caught the prefix");
    return YES; …
Run Code Online (Sandbox Code Playgroud)

methods protocols ios uiwebviewdelegate

7
推荐指数
2
解决办法
2万
查看次数