2015-10-08 58 views
4

我有一个UIViewControllerUITextView自动检测其文本中的超链接。它工作正常,但我想用SFSafariViewController打开链接,因此我保留在我的应用程序“内部”,而不是打开一个单独的浏览器,这是“开箱即用”的行为。打开网站与SFSafariViewController从UITextView自动检测链接

我已经采取了下面的步骤大纲,但网站仍然打开一个单独的Safari浏览器,而不是我的应用程序。我没有收到任何错误或警告,但检测到的网站仍然在单独的浏览器中打开,而不是在我的应用程序中打开。 UITextViewDelegate方法似乎没有被调用(我扔了一个日志语句来检查)。

我看着UITextViewDelegate,我想我想用这个方法来打开年代由UITextView检测网站:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { 
    // Fill code in here to use SFSafariViewController 
    return YES; 
} 

什么我迄今所做的:

1)进口SafariServices ,做了委托声明,并在MyViewController中声明了一个委托属性。 ^h

@import SafariServices; 

@interface MyViewController : UIViewController <UITextViewDelegate, SFSafariViewControllerDelegate> 

@property(nonatomic, weak, nullable) id< SFSafariViewControllerDelegate, SFSafariViewControllerDelegate > delegate; 

2)增加了一个代表部分,以我的.m文件,并试图以这种方法来填补从上面的存根:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { 
    SFSafariViewController *websiteToOpen = [[SFSafariViewController alloc]initWithURL:URL entersReaderIfAvailable:YES]; 
    websiteToOpen.delegate = self; 
    [self presentViewController:websiteToOpen animated:YES completion:nil]; 
    return YES; 
} 

我敢肯定这是100%,我这个碴但我无法超越终点线。我错过了什么?

回答

1

我试图做同样的事情,但有不同的问题。

首先,您需要设置您的文本视图的委托,以便触发delegate方法。我在viewDidLoad中做到这一点:

myTextView.delegate = self; 

然后,告诉你UITextView与URL交互:

- (BOOL)textView:(UITextView *)textView 
     shouldInteractWithURL:(NSURL *)url 
     inRange:(NSRange)characterRange 
{ 
    [self presentViewController:websiteToOpen animated:YES completion:nil]; 
    return NO; 
} 

有了这个,我可以提出的Safari浏览器视图控制器,虽然是空的,即没有内容和没有完成按钮。所以我在做别的事情错了......

+0

你可以编辑你的答案,并把它放在斯威夫特?提前致谢!! –

3

你在你的实现,它告诉系统,继续前进,做你打算用这个URL做(在这种情况下结束返回YES,开苹果浏览器)。如果您决定自己处理此问题,请改为返回NO

如此说来,一些注意事项:

  • Safari浏览器视图控制器仅支持HTTP/HTTPS的网址。在使用Safari视图控制器之前,请确保您检查了URL.scheme
  • 虽然textView:shouldInteractWithURL:inRange:文档建议,你应该使用这个方法来拦截的URL上的水龙头......

    您可以使用此方法来替代作用,比如在URL显示网页内容在当前应用程序的Web视图中。

    ...你要小心。 “应该交互”不仅仅包括一个普通的点击 - 这种方法也会被称为长按等等,这通常会有不同的行为,并且我不知道如何确定为什么这个委托方法正在调用。

出于这些原因,你可能要考虑安装自己UITapGesturRecognizerUITextView,如this answer详述。

5

万一有人在寻找斯威夫特3执行。

解决方案,工程:

1.Importing Safari浏览器服务

import SafariServices 

2.创建属性文本,添加链接到它,指定字符串的TextView

let myLink = "google.com" 
let myText = "here is my link: \(myLink)" 
let myAttributedText = NSMutableAttributedString(string: myText) 
let rangeOfMyLink = myText.range(of: myLink) 
if rangeOfMyLink.location != NSNotFound { 
    myAttributedText.addAttributes([NSLinkAttributeName: myLink], range: rangeOfMyLink) 
} 
myTextView.attributedText = myAttributedText 
myTextView.delegate = self 

3.添加代表到VC:

class MyViewController: UIViewController, UITextViewDelegate 

4.Adding委托方法:

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { 
    let safariVC = SFSafariViewController(url: URL) 
    present(safariVC, animated: true, completion: nil) 
    return false 
} 

希望它能帮助!