2012-04-07 26 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