从 UIWebView 委托呈现 ViewController

Posted

技术标签:

【中文标题】从 UIWebView 委托呈现 ViewController【英文标题】:Presenting ViewController from UIWebView delegate 【发布时间】:2012-08-22 17:37:26 【问题描述】:

我有一个UIWebView 和一个代表id<UIWebViewDelegate>。当我点击 UIWebView 中的链接时,我在回调中得到 NSURLRequest 对象:

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

我想做的是:

- (void)presentWebViewControllerWithUrl:(NSURL*)URL
      SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithURL:URL];
      webViewController.modalPresentationStyle = UIModalPresentationPageSheet;
      webViewController.availableActions = SVWebViewControllerAvailableActionsOpenInSafari | SVWebViewControllerAvailableActionsCopyLink | SVWebViewControllerAvailableActionsMailLink;
      [self presentModalViewController:webViewController animated:YES];

当我将此代码放在我的主视图控制器中时,会出现模式 Web 视图,但如果我将它放在我的委托中,它不会出现。如何让它出现?


更新:

shouldStartLoadWithRequest 返回NO 只会让我的 UIWebViews 变成白色,没有内容。似乎在 webviews 加载时正在调用回调。我正在使用[web loadhtmlString:@"..." baseUrl: nil] 将本地存储的HTML 加载到它们中 模态永远不会出现。

我的视图层次如下:

    主视图 UI 视图 UIScrollView UIWeb 视图 UIWeb 视图 ...

有没有办法让回调“冒泡”以便我可以在主视图控制器中看到事件?

【问题讨论】:

【参考方案1】:

确保在覆盖您的 shouldStartLoadWithRequest 委托方法时返回 (NO)。

另外,我在您的代码中看不到 [viewController presentModalViewController:webViewController animated:YES],如下所示:

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
    
     if (navigationType != UIWebViewNavigationTypeLinkClicked)
      return (YES);

     SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithURL:[request URL]]; 
     webViewController.modalPresentationStyle = UIModalPresentationPageSheet;  
     webViewController.availableActions = SVWebViewControllerAvailableActionsOpenInSafari | SVWebViewControllerAvailableActionsCopyLink | SVWebViewControllerAvailableActionsMailLink; 
     [myViewController presentModalViewController:webViewController animated:YES];
     return(NO);
    

【讨论】:

这个方法对我不起作用。也许有一种方法可以将回调“冒泡”到我的主视图控制器? [self presentModalViewController...] 假定此委托方法位于 UIViewController 类中。在调试器中运行,看看发生了什么。我还编辑了代码,因为您应该检查 navigationType 嗨,我面临着完全相同的问题。我已经花了 2 天时间寻找解决方案,但它使我的应用程序崩溃。请帮帮我....

以上是关于从 UIWebView 委托呈现 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 mapKit 从 ViewController 将坐标发送到具有委托的另一个 viewController

从当前模态的委托中呈现 UIAlertView

@interface 中的 UIWebView 委托设置

UIWebView 中的 UIScrollView 的委托方法未调用水平滚动

从应用程序委托中呈现故事板视图控制器?

从应用程序委托不平衡调用开始/结束外观呈现模态视图