我有一个应用程序,用户可以在其中导航一堆本地存储的HTML文件.我有一个UIWebView,正确配置了一个UIWebViewDelegate.通常,当用户跟随链接时,shouldStartLoadWithRequest会调用,之后会webViewDidFinishLoad稍后调用.
但是,如果链接指向与当前显示的链接相同的页面上的锚点,则仅shouldStartLoadWithRequest调用该链接.webViewDidFinishLoad不开火.
从某种意义上说,我发现这可能是预期的行为,因为页内导航不应该要求页面重新加载.但是,在页面导航完成后,我真的需要一个可以挂钩到调用堆栈的地方.当任何类型的导航结束时,最佳解决方案将让我知道,包括来自另一页面,页内和前进/后退动作.
到目前为止,我最好的解决方法是performSelector: withObject: afterDelay:在我的shouldStartLoadWithRequest方法结束时调用,但我对此并不满意.
有谁知道我怎么能正确解决这个问题?有任何见解赞赏!
我坚持要在我的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) 我正在尝试滚动到我在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.
任何想法将不胜感激.
谢谢!
我正在尝试在应用启动时加载网址.
我拖动了一个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)
然而,我只是在设备上得到一个黑屏,就像没有任何视图.任何的想法?
我需要检查完成加载时的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,用于登录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 中什么都不做?
我用a UIWebView来显示一些内容.在此内容中,用户可以浏览使用AJAX加载的一堆站点.这个网站上的一步需要相当长的一段时间.因为我没有找到关于timeoue的任何内容,UIWebView所以我试图在初始NSURLRequest加载时设置它.
不幸的是,这似乎没有做任何事情.我不太确定我是否应该自己设置超时?有什么我想念的吗?是否UIWebView重写我的超时?我对此有点困惑所以任何帮助都会受到赞赏.:)
最好的
-f
更新
我建立了一个测试项目来验证关于UIWebView超时工作方式的"理论" .这是设置:
一个带有单个视图的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
我正在尝试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) 我已经研究过并且仍然不明白为什么从未调用过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) uiwebview ×9
ios ×6
cocoa-touch ×2
iphone ×2
javascript ×2
objective-c ×2
focus ×1
ios5 ×1
methods ×1
navigation ×1
pdf ×1
protocols ×1
safari ×1
scroll ×1
timeout ×1
xcode ×1