【问题标题】:Open links in Safari instead of UIWebVIew?在 Safari 而不是 UIWebVIew 中打开链接?
【发布时间】:2010-12-15 17:05:28
【问题描述】:

我有一个在UIViewController 中带有UIWebView 的应用程序。我从 Web 服务加载 HTML 作为字符串,如下所示:

self.webView loadHTMLString:_string baseURL:nil

是否可以在浏览器中打开此字符串中的 HTML 链接,而不是在我的应用程序的 UIWebView 中打开?我该怎么做?

我已经在“托管”UIWebVIew 的 UIViewController 中尝试过这个:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
   if (navigationType == UIWebViewNavigationTypeLinkClicked) {
     [[UIApplication sharedApplication] openURL:[request URL]];
     return NO;
   }
   return YES;
}

好像没用……

有什么想法吗?

【问题讨论】:

  • 假设 [request URL] 是 Safari(或 iOS 设备上的其他应用程序)可以处理的 URL 类型,您发布的代码应该可以工作。您能否发布一个用户将点击的 URL 的示例?

标签: ios uiwebview


【解决方案1】:

您是否将UIWebView 的代表设置为您的UIViewController?据我所知,您的代码没有明显的问题,所以很可能是这样的小问题。

【讨论】:

  • 是的,我做到了。 但我确实添加了如下内容:不确定它是错误还是正确,但 ut 似乎正在工作:webView.delegate = self;加这个有错吗???
  • 在类定义中添加<UIWebViewDelegate>仅仅意味着你实现了协议。这并不意味着它代表,只是它可以是。您确实需要 webView.delegate = self(或者您可以在 Interface Builder 中执行此操作)。
  • @Yar 答案已经说过了。该评论阐明了UIWebViewDelegate 协议和delegate 属性之间的区别。
【解决方案2】:

在课堂上添加这个..

@interface yourViewController : UIViewController
<UIWebViewDelegate>

在视图中添加这个确实加载了

- (void)viewDidLoad
{
    [description loadHTMLString:string baseURL:nil];
        description.delegate = self;
}

将此添加到您的 .m 文件中

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( inType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
    }

    return YES;
}

注意:

UIWebView *description;
@synthesize description;

那么它将以您应得的方式完美运行..!! :)

【讨论】:

  • 请务必将 webView 中的 V 大写,例如:-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType
  • 我正在使用 UIWebView 显示来自网络的报价,并在每个报价的末尾有一个指向源的链接。这对我来说可以在 Safari 而不是 UIWebView 中打开链接。
【解决方案3】:

UIWebViewdelegate 设置为您的 UIViewController 之后使用此 UIWebview 方法并检查条件,例如 now webview current url是 google.com,如果假设您单击 gmail,则 url 包含带有 gmail 的字符串。使用以下方法打开一个 safari 浏览器并自动加载该 URL。

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( inType == UIWebViewNavigationTypeLinkClicked ) {
        NSURL *url = [inRequest URL];
        if ([[url absoluteString] rangeOfString:@"gmail"].location == NSNotFound) {
            [[UIApplication sharedApplication] openURL:[inRequest URL]];
            return NO;
        }
    }
    return YES;
}

【讨论】:

    【解决方案4】:

    如果您已经正确设置了 UIWebViewDelegate,只需这样做

    self.webView loadHTMLString:_string baseURL:nil
    self.webView.delegate = self;
    

    应该工作

    【讨论】:

      【解决方案5】:

      添加这一行 ( self.webview.delegate = 自我; )

      例如在 viewController.m 中

      NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
      NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
      [self.webview loadHTMLString:htmlString baseURL:nil];
      self.webview.delegate = self;
      

      【讨论】:

        【解决方案6】:

        Apple 在 iOS 9 上引入了 Safari 视图控制器。Safari 视图控制器将用户期望从 Safari 获得的所有功能带到您的应用程序中,而无需离开它。

        首先我们需要导入 Safari 服务

        #import <SafariServices/SafariServices.h>
        

        对于目标 C:-

        NSString *yourUrl = @"http://yourURL";
        SFSafariViewController *svc= [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString: yourUrl]];
        [self presentViewController:svc animated:YES completion:nil];
        

        对于斯威夫特:-

        let svc = SFSafariViewController(URL: NSURL(string: self.urlString)!)
        self.presentViewController(svc, animated: true, completion: nil)
        

        【讨论】:

          【解决方案7】:

          是的,在你的超链接标签中添加

          target="blank"
          

          一个问号就可以了,谢谢

          【讨论】:

          • 设置target="blank"target="_blank" 似乎没有效果。在 iOS 4.3 上,链接仍然在 UIWebView 中打开。
          猜你喜欢
          • 2010-11-21
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 2011-04-05
          • 2013-01-07
          相关资源
          最近更新 更多