web-dev-qa-db-ja.com

UIWebVIewの代わりにSafariでリンクを開きますか?

UIWebView内にUIViewControllerを含むアプリがあります。次のような文字列としてWebサービスからHTMLをロードします。

self.webView loadHTMLString:_string baseURL:nil

この文字列のHTMLリンクを、アプリのUIWebViewではなくブラウザーで開くことはできますか?これどうやってするの?

私は、UIWebVIewを「ホスト」するUIViewControllerでこれを試しました。

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
   if (navigationType == UIWebViewNavigationTypeLinkClicked) {
     [[UIApplication sharedApplication] openURL:[request URL]];
     return NO;
   }
   return YES;
}

動作していないようです...

何か案は?

27
treasure

UIWebViewのデリゲートをUIViewControllerに設定しましたか?私の知る限り、コードに明らかに問題はありません。そのため、そのような小さなものである可能性があります。

23

これをクラスに追加します。

@interface yourViewController : UIViewController
<UIWebViewDelegate>

これをビューに追加するとロードされました

- (void)viewDidLoad
{
    [description loadHTMLString:string baseURL:nil];
        description.delegate = self;
}

これを.mファイルに追加します

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( inType == UIWebViewNavigationTypeLinkClicked ) {
        [[UIApplication sharedApplication] openURL:[inRequest URL]];
        return NO;
    }

    return YES;
}

注意:

UIWebView *description;
@synthesize description;

その後、それはあなたが値する方法で完全に動作します.. !! :)

21

UIWebViewdelegateIViewControllerに設定してから、このUIWebviewメソッドを使用して、条件。たとえば、現在webviewの現在のURLはgoogle.comです。Gmailをクリックした場合、URLにはGmailの文字列が含まれています。以下のメソッドを使用して、Safariブラウザを開き、そのURLを自動的にロードしました。

-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
    if ( inType == UIWebViewNavigationTypeLinkClicked ) {
        NSURL *url = [inRequest URL];
        if ([[url absoluteString] rangeOfString:@"gmail"].location == NSNotFound) {
            [[UIApplication sharedApplication] openURL:[inRequest URL]];
            return NO;
        }
    }
    return YES;
}
1
Karthik

AppleはiOS 9にSafari View Controllerを導入しました。SafariView Controllerは、ユーザーがSafariに期待するすべての機能を、アプリから離れることなくアプリに提供します。

まず、Safariサービスをインポートする必要があります

#import <SafariServices/SafariServices.h>

目的Cの場合:-

NSString *yourUrl = @"http://yourURL";
SFSafariViewController *svc= [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString: yourUrl]];
[self presentViewController:svc animated:YES completion:nil];

Swiftの場合:-

let svc = SFSafariViewController(URL: NSURL(string: self.urlString)!)
self.presentViewController(svc, animated: true, completion: nil)
0
Vincent Joy

UIWebViewDelegateをすでに適切に設定している場合は、単に

self.webView loadHTMLString:_string baseURL:nil
self.webView.delegate = self;

うまくいくはず

この行を追加(self.webview.delegate = self;)

たとえば、viewController.m

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[self.webview loadHTMLString:htmlString baseURL:nil];
self.webview.delegate = self;
0
Carlos Parada