在(BOOL)webView 中:如何打开在 UIWebView 中单击的 URL 以打开模态 UIWebView

Posted

技术标签:

【中文标题】在(BOOL)webView 中:如何打开在 UIWebView 中单击的 URL 以打开模态 UIWebView【英文标题】:Within a (BOOL)webView: How to open a URL clicked in UIWebView that opens a Modal UIWebView 【发布时间】:2012-04-07 06:15:31 【问题描述】:

感谢您查看我的问题。让我先描述一下这个应用程序。我有一个基于 ios5.1 的标签栏应用程序,它使用故事板和 ARC。有四个选项卡,每个选项卡都有一个视图控制器,显示一个带有本地 html 文件的 web 视图(每个视图是一组不同的要显示的 html 文件)。

目前,当用户点击 http 或 https 链接时,它将在 Safari 中打开。但是,我现在希望它通过模态视图在应用程序中打开。我目前已创建并准备显示界面,但我无法将 URL 传递给模态的“webview2”。我已经寻找了许多使用 RSURL 和字符串等执行此操作的示例,但无法让它们中的任何一个工作。给出的一些示例代码似乎不适用于我的情况。

在我的 FirstViewController.m 文件中(在其他视图中相同),我有...

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

    //Gets the link.
    if (navigationType == UIWebViewNavigationTypeLinkClicked) 
        NSURL *URL = [request URL]; 
        NSLog(@"url:%@",request); //Get's the url itself

        //If it's an external link...
        if ([[URL scheme] isEqualToString:@"http"] || 
            [[URL scheme] isEqualToString: @"https" ])  
            [[UIApplication sharedApplication] openURL:[request URL]];
            NSLog(@"Opened in Safari");
            return NO;
        

        //If it's an email address...
        else if ([[URL scheme] isEqualToString:@"mailto"]) 
            [webView loadRequest:request];
            [[UIApplication sharedApplication] openURL:[request URL]];
            NSLog(@"Opened in Mail App");
            return NO;
        
            
    return YES;
  

如果我希望在 Safari 中打开 URL,这可以正常工作。所以在这部分...

//If it's an external link...
    if ([[URL scheme] isEqualToString:@"http"] || 
        [[URL scheme] isEqualToString: @"https" ])  
        [[UIApplication sharedApplication] openURL:[request URL]];
        NSLog(@"Opened in Safari");
        return NO;
    

我需要它来打开带有点击 URL 的模式视图,而不是 Safari。

所以我要问的是... 保存此 URL 的最佳方法是什么,然后打开模态视图,然后在模态 Web 视图中打开刚刚触摸的 URL?

我已经有了使用关闭按钮等制作的模式视图。我只需要在加载时加载点击的 URL。

我可以通过线路加载模态...

[self performSegueWithIdentifier:@"ModalWebView" sender:self];

当然,这只是在没有任何 URL 信息和空白 web 视图的情况下加载它。 modal 使用 WebViewController.h/m。

如果有人能告诉我如何打开和传递 URL,以便它加载到 segue“ModalWebView”中,我将不胜感激。请让我知道我是否需要在运行模态视图的 WebViewController.h/m 中包含任何属性或其他任何内容。也许需要使用 -(void)prepareForSegue?如果有,怎么做?

我意识到答案可能很简单,但我仍然是一个初学者,并且花了几天时间试图找到一个明确的答案。我之前通过搜索在这个网站上找到了很多问题的答案,但我担心我被困在这个问题上。

感谢您的时间和耐心。

【问题讨论】:

【参考方案1】:

在您的视图控制器中,实现prepareForSegue 方法并添加以下代码。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 

    NSLog(@"Source Controller = %@", [segue sourceViewController]);
    NSLog(@"Destination Controller = %@", [segue destinationViewController]);
    NSLog(@"Segue Identifier = %@", [segue identifier]);

    if ([segue.identifier isEqualToString:@"ModalWebView"]) 

        ModalWebViewController *wVC = [segue destinationViewController];
        wVC.url = [NSURL URLWithString:article.url]; // replace article.url with your url.
    


在我上面的代码中,将使用的 URL 是从我的 article.url 对象中设置的。要让它工作,你需要从方法shouldStartLoadWithRequest 中获取url。

// CurrentViewController.h
@property (strong, nonatomic) NSURL *targetUrl;

// CurrentViewController.m 
//If it's an external link...
    if ([[URL scheme] isEqualToString:@"http"] || 
        [[URL scheme] isEqualToString: @"https" ])  
        targetUrl = url;
        [self performSegueWithIdentifier:@"ModalWebView" sender:self];
        return NO;
    

如果使用上述方法,我们现在将第一个代码块中的 article.url 替换为 targetUrl。

if ([segue.identifier isEqualToString:@"ModalWebView"]) 

            ModalWebViewController *wVC = [segue destinationViewController];
            wVC.url = targetUrl; 
        

在您的视图控制器中为您的模态 web view.h 文件创建一个 NSURL。

//ModalWebViewController.h
@property (strong, nonatomic) NSURL *url;

在您的实现文件 (.m) 中创建方法 viewDidAppear

//ModalWebViewController.m 
-(void) viewDidAppear:(BOOL)animated 
    [_webView loadRequest:[NSURLRequest requestWithURL:url]];

希望我已经解释了足够的内容,以便您能够实施。

【讨论】:

我设置了你所说的(顺便谢谢你),但我收到错误“不兼容的指针类型将'NSURL *__strong'发送到'NSString *'类型的参数” wVC.url = [NSURL URLWithString:targetUrl];"引用“targetURL”部分的行。我在 FirstViewController.h 和 @synthesize targetUrl 中有该属性;在 FirstViewController.m 中。非常感谢您的帮助。我觉得我们现在很接近了。 对不起,我的代码有点错误,targetURL 已经是一个 NSURL,因此 wVC.url = targetURL 就足够了。试试看。 宾果游戏!就是这样!你是最好的!我希望我早点问。会为我节省很多时间。活到老,学到老。感谢您的宝贵时间!

以上是关于在(BOOL)webView 中:如何打开在 UIWebView 中单击的 URL 以打开模态 UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

ios 8 webview在Safari中打开外部链接,除了一个

在 Safari 而不是 webView 上仅打开特定 URL

我可以在 webview 中打开相机吗?

Android WebView

打开 UI webview 时,RestKit 未将 URL 添加到后退列表

(BOOL) webView... 不触发所有请求