我正在处理iOS应用的更新。 目前您可以使用静态后退按钮(在我的故事板中创建和链接)返回,但我希望通过导航控制器重定向到新的WebView。 这是目前的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"http://example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.navigationController pushViewController:url animated:YES];
[webView loadRequest:request];
}
我该怎么做? 非常感谢你提前!!
最高
答案 0 :(得分:0)
显然,这段代码没有意义(例如url
不是UIViewController
所要求的pushViewController
等等,但我们可以对你所做的事情做出明智的猜测试图做。我猜你说你想让后退按钮像网页浏览器上的后退按钮一样,但你希望标准导航控制器能够为你做好准备。这意味着您还建议每次单击页面上的链接时,您希望推送到另一个视图控制器以显示下一个网页(以便后退按钮可以将您带回到上一个使用上一个网页查看控制器。)
如果这就是你问的问题,那可能不是一个好主意。这意味着每次您点击网络浏览器中的链接时,您都需要使用UIWebViewDelegate
方法shouldStartLoadWithRequest
拦截该请求,而不是让当前UIWebView
满意该请求,而是推送到另一个视图控制器与UIWebView启动该页面。可悲的是,这是很多工作,并且令人难以置信地浪费了内存资源。它也不适用于很多网页。底线,不是一个好主意。
将按钮添加到托管UIWebView
的视图控制器更容易,然后让UIWebView
完成它的所有魔力。然后,您可以添加用户在iOS网络浏览器上增长的所有其他按钮(不仅是后退按钮,还可以是前进按钮,可能是主页按钮,可能是“操作”按钮,可让您在Safari中打开页面,在fb上分享等等。无论你想要什么。但用户期望的不仅仅是一个“后退”按钮。
<强>更新强>
如果您真的想在用户点击链接时推送到另一个视图控制器,您可以截取shouldStartLoadWithRequest
,如前所述。但是,以下代码示例假定:
BOOL
个实例变量loadFinished
。无论如何,您可能需要这三种UIWebViewDelegate
方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if (!initialLoadFinished)
{
// if we're still loading this web view for the first time, then let's let
// it do it's job
return YES;
}
else
{
// otherwise, let's intercept the webview from going to the next
// html link that the user tapped on, and create the new view controller.
// I'm making the next controller by instantiating a scene from the
// storyboard. Because you may be using NIBs or because you have different
// class names and storyboard ids, you will have to change the following
// line.
ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"webview"];
// I don't know how you're passing the URL to your view controller. I'm
// just setting a (NSString*)urlString property.
controller.urlString = request.URL.absoluteString;
// push to that next controller
[self.navigationController pushViewController:controller animated:YES];
// and stop this web view from navigating to the next page
return NO;
}
}
// UIWebView calls this when the page load is done
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
initialLoadFinished = YES;
}
// UIWebView calls this if the page load failed. Note, though, that
// NSURLErrorCancelled is a well error that some web servers erroneously
// generate
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
if (error.code != NSURLErrorCancelled)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Web Loading Error"
message:nil // error.localizedDescription
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
initialLoadFinished = YES;
}
}
就个人而言,我可能会坚持使用标准UIWebView
,但如果你想跳转到导航控制器,就可以了。顺便说一下,上面的hack可能无法很好地处理重定向,所以请确保你正确的URL。