【问题标题】:UIWebView: open some links in Safari, some within the viewUIWebView:在 Safari 中打开一些链接,在视图中打开一些
【发布时间】:2010-09-06 11:16:05
【问题描述】:

我的应用具有在 UIWebView 中呈现的内容(出于文本格式的原因)。内容中有链接,其中一些应在移动 Safari 中打开其目标,而另一些应在内容中导航。

到目前为止,我已经使用 UIWebView 委托捕获了链接请求。在我的实现中

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

我会使用 lastPathComponentpathComponents 检查请求 URL 中的已知元素,以确定是在视图外部还是在视图内打开链接。

但是,我刚刚发现上述方法仅在 iOS 4.0 之后才可用,这会使该应用程序在 iPad 上无用。另外,我觉得我在这里使用了一个肮脏的解决方案。

在处理委托方法中的请求时,是否有另一种方法可以以某种方式“标记”我的内容中的链接,以便以后易于区分?

非常感谢!!

【问题讨论】:

    标签: iphone objective-c cocoa-touch uiwebview


    【解决方案1】:

    您可以将 URL 请求转换为字符串,然后将您网站上的子目录(例如仅以“http://www.sample.com/myapp/myappswebcontent/”开头的 URL)与 URL 的初始子字符串进行比较。其他任何东西,发送到 Safari。

    【讨论】:

      【解决方案2】:

      您应该设置 web 视图的策略委托: 例如在控制器中,它包含一个 web 视图

      [webView setPolicyDelegate:self];
      

      然后重写一个decisionPolicyForNavigation方法(这只是一个例子):

      - (void)webView:(WebView *)sender decidePolicyForNavigationAction: (NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener
      {       
          if ([[actionInformation objectForKey:WebActionNavigationTypeKey] intValue]  == WebNavigationTypeLinkClicked) {
              [listener ignore];
              [[NSWorkspace sharedWorkspace] openURL:[request URL]];
          }
          else
              [listener use];
      }
      

      您可以区分链接类型并忽略或使用侦听器。如果您忽略它,您可以在 safari 中打开该链接,如果您使用它,该链接将在您的 webview 中打开。

      HTH

      【讨论】:

      • 用 UIApplication sharedApplication 替换 NSWorkspace 位。 UIApplication 有一个 openURL: 方法 asweep。检查 UIApplication 标头。
      • 对,对不起,这个例子来自mac应用程序,使用Chris Parker写的sharedApplication的openURL
      猜你喜欢
      • 2011-04-05
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2016-04-16
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多