为 segue 控制器设置 webview 委托?

Posted

技术标签:

【中文标题】为 segue 控制器设置 webview 委托?【英文标题】:Setting a webview delegate for a segue controller? 【发布时间】:2013-01-16 22:21:37 【问题描述】:

我有两个通过模态转接连接的视图控制器。目标控制器也有一个 UIWebView。

阅读文档我想选择第一个控制器来负责关闭 webview 控制器,我这样做的操作将在 webview 委托方法中。

我正在尝试这个:

第一个控制器:

@interface ABISignInViewController : UIViewController <UIWebViewDelegate>
...

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
...
   else if ([[segue identifier] isEqualToString:@"showWebViewForSignUp"]) 
    ABIWebBrowserViewController *webViewController = (ABIWebBrowserViewController *)segue.destinationViewController;
    [webViewController.webView setDelegate:self];
    [webViewController setUrlString:@"https://myurl"];
  


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
  NSLog(@"%@", request);
  return YES;

第二个控制器启动并开始加载请求的 url:

- (void)viewDidAppear:(BOOL)animated 
  NSURL *url = [NSURL URLWithString:self.urlString];
  NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
  [self.webView loadRequest:requestObj];

然而,第一个控制器中的委托方法永远不会被调用。 有什么路线吗?

【问题讨论】:

【参考方案1】:

为什么不将 URL 作为 NSString 或 NSURL 传递,然后让带有 WebView 的 ViewController 处理委托方法?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
...
   else if ([[segue identifier] isEqualToString:@"showWebViewForSignUp"]) 
    ABIWebBrowserViewController *webViewController = (ABIWebBrowserViewController *)segue.destinationViewController;
    webViewController.urlString = @"https://myurl";
  

WebView 视图控制器:

- (void)viewDidAppear:(BOOL)animated 
  NSURL *url = [NSURL URLWithString:self.urlString];
  NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
  [self.webView loadRequest:requestObj];


- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
  NSLog(@"%@", request);
  return YES;

【讨论】:

因为我希望第一个控制器根据请求的 url 负责关闭模态 webview 控制器,因此控制器也是可重用的。请参阅此处:developer.apple.com/library/ios/#featuredarticles/…“关闭呈现的视图控制器” 然后您将使用协议和委托模式来执行此操作。看到这个答案:***.com/questions/8905961/…

以上是关于为 segue 控制器设置 webview 委托?的主要内容,如果未能解决你的问题,请参考以下文章

从 tableView 委托类中调用视图控制器 segue

webView.loadRequest 错误,如果使用 presentViewController,但如果使用 segue 则一切正常

iOS Modal Segue 丢弃源 ViewController?

将数据传递给父场景的委托与展开 Segue

为 UITableViewController 展开 segue?

情节提要弹出框已关闭,未调用委托方法