2012-04-07 63 views
3

感谢您查看我的问题。让我先描述一下这个应用程序。我有一个基于标签栏的iOS5.1应用程序,使用storyboard和ARC。每个视图控制器都有四个选项卡,用于显示带有本地HTML文件的web视图(每个视图都是一组不同的html文件)。在(BOOL)webView中:如何打开在UIWebView中单击的URL,以打开模式UIWebView

当前用户触摸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中打开工作正常。所以在这一部分...

//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; 
    } 

我需要它打开与点击的网址,而不是Safari的模态浏览。

所以我问的是... 什么是最好的方式来保存这个网址,然后打开模态视图,然后在模态webview中打开刚刚触摸的网址?

我已经有一个模式的视图与解雇按钮等。我只是需要它加载点击的URL加载时。

我可以通过线加载模式...

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

但只是加载它没有任何URL信息和空白的WebView,当然。该模式使用WebViewController.h/m。

如果有人能告诉我如何打开和传递的URL,所以它加载在segue“ModalWebView”,我将不胜感激。请让我知道是否需要制作任何属性或其他任何应该包含在运行模式视图的WebViewController.h/m中的内容。也许 - (无效)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. 
    } 

} 

在我上面的代码中,将使用从我的article.url对象中设置的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]]; 
} 

希望我已经解释说,足够你能够实现。

+0

我设置你怎么说(谢谢你的方式),但我发现和错误“不兼容的指针类型发送‘NSURL * __强’到类型‘的NSString *’的参数”为“wVC.url = [ NSURL URLWithString:targetUrl];“表示“targetURL”部分。我在FirstViewController.h和@synthesize targetUrl这个财产;在FirstViewController.m中。非常感谢您的帮助。我觉得我们现在非常接近。 – Kagemusha 2012-04-07 11:45:18

+0

对不起我的代码是稍有不当,TargetURL中已经是一个NSURL,因此wVC.url = targetUrl这个就足够了。试试看。 – 2012-04-07 15:24:03

+0

宾果!就是这样!你最好!我希望我早些时候会问。会为我节省很多时间。活到老,学到老。谢谢你的时间! – Kagemusha 2012-04-07 20:00:35