将 webview 请求抛出到另一个 webview

Posted

技术标签:

【中文标题】将 webview 请求抛出到另一个 webview【英文标题】:Throwing webview request to another webview 【发布时间】:2009-04-20 15:09:57 【问题描述】:

我有一个 UIViewController,里面有一个 UIWebView (webview1)。网页视图只有几行文本,但里面确实有一个链接。我不想在这个狭小的空间中打开指向外部网站的链接,而是将其发送到 webview2,这将是一个全屏。目标是将网络请求保留在我的应用程序中,而不是 Safari 中。我不想为 webview2 创建另一个控制器,而是使用 webview1 的控制器。

在 Webview1Controller 控制器中,我在 webViewLoad 中执行此操作:

webview1.delegate = self;

这是我将 Web 请求交给 webview2 的地方,效果很好:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

myapp *delegate = [[UIApplication sharedApplication] delegate];
Webview1Controller *webview1Controller = [[Webview1Controller alloc] initWithNibName:@"webview2" bundle:nil];
//self.view = webview2;'
[delegate.navigationController pushViewController: webview1Controller animated:YES];
[webview1Controller.webview2 loadRequest:request];
[webview1Controller release];
return YES;

在 Interface Builder 中,我将 webview2.xib 文件的 Owner 类设置为 Webview1Controller。它的“视图”和 webview2outlet 已连接。我在 Webview1Controller 中有一个名为 webview2outlet 的 IBOutlet。

当我返回 webview1 时,它也加载了相同的请求。有没有办法阻止 webview1 加载任何东西?如果我在上述方法中返回 NO,webview1 将不会呈现我的内容。

一种解决方案就是在 viewWillAppear 上重新加载 webview1 内容,这很有效。但是有没有更好的方法?

【问题讨论】:

【参考方案1】:

从委托方法返回NO

关于您的评论,我认为您想要做的是让您的委托方法检查哪个 webview 正在调用您的控制器:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    if (webView == webview1) 
        Webview1Controller *webview1Controller = [[Webview1Controller alloc] initWithNibName:@"webview2" bundle:nil];
        [self.navigationController pushViewController:webview1Controller animated:YES];
        [webview1Controller.webview2 loadRequest:request];
        [webview1Controller release];
        return NO;
    
    else 
        return YES;
    

(另外请注意,UIViewController 有一个 navigationController 属性,因此您可以使用它而不是通过您的应用委托获取它)。

【讨论】:

【参考方案2】:

如果您加载请求的副本而不是原始请求,然后返回 NO,会发生什么情况?

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

    myapp *delegate = [[UIApplication sharedApplication] delegate];
    Webview1Controller *webview1Controller = [[Webview1Controller alloc] initWithNibName:@"webview2" bundle:nil];
    //self.view = webview2;'
    [delegate.navigationController pushViewController: webview1Controller animated:YES];
    [webview1Controller.webview2 loadRequest:[[request copy] autorelease]];
    [webview1Controller release];
    return NO;

【讨论】:

返回 NO 会导致 webview1 为空白。当主视图加载时,上述方法也会触发。因为它会导致一个空白的 webview1,所以永远不会有任何链接可以点击。

以上是关于将 webview 请求抛出到另一个 webview的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:将异常从 Python 抛出到 C++

javascript 提供用于从React-Native WebView发送和接收消息的示例实现(使用postMessage / onMessage WebVie)

swift 构建OSX拖放操场:将dragndrop.swift抛出到共享源中,然后测试单个playgro中的示例

带有发布请求的swift3 webview

从一个分支签出到另一个分支时,Pycharm“保持更改”? [复制]

从模态视图控制器推送/弹出到另一个视图控制器(包括图片)