当前位置:  开发笔记 > 编程语言 > 正文

如何拦截点击UITextView中的链接?

如何解决《如何拦截点击UITextView中的链接?》经验,为你挑选了4个好方法。

当用户在UITextView中触摸自动检测的手机链接时,是否可以执行自定义操作.请不要建议使用UIWebView.

请不要只重复苹果课程中的文字参考 - 当然我已经读过了.

谢谢.



1> fsaint..:

更新:从ios10,

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction;

从ios7和Later UITextView有委托方法:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange *NS_DEPRECATED_IOS(7_0, 10_0, "Use textView:shouldInteractWithURL:inRange:forInteractionType: instead");*

拦截点击链接.这是最好的方法.

对于ios6和更早版本,一个很好的方法是通过子类化UIApplication和覆盖-(BOOL)openURL:(NSURL *)url

@interface MyApplication : UIApplication {

}

@end

@implementation MyApplication


-(BOOL)openURL:(NSURL *)url{
    if  ([self.delegate openURL:url])
         return YES;
    else
         return [super openURL:url];
}
@end

您需要openURL:在您的代理中实施.

现在,要让应用程序从您的新子类开始,请UIApplication在项目中找到main.m文件.在这个引导你的应用程序的小文件中,通常有这一行:

int retVal = UIApplicationMain(argc, argv, nil, nil);

第三个参数是应用程序的类名.所以,将此行替换为:

int retVal = UIApplicationMain(argc, argv, @"MyApplication", nil);

这对我有用.


这似乎只适用于网络链接,而不适用于自动编码的电话号码.
您还可以对"UIApplication"进行分类并替换openURL实现.虽然这种方式引用原始实现很棘手(但并非不可能).

2> Rajan Balana..:

在iOS 7或更高版本中

您可以使用以下UITextView委托方法:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

如果用户点击或长按URL链接,则文本视图会调用此方法.此方法的实现是可选的.默认情况下,文本视图打开负责处理URL类型的应用程序并将URL传递给它.您可以使用此方法触发替代操作,例如在当前应用程序的Web视图中的URL处显示Web内容.

重要:

仅当文本视图可选但不可编辑时,文本视图中的链接才是交互式的.也就是说,如果UITextView的值为selectable属性为YES且isEditable属性为NO.



3> Esqarrouth..:

迅捷版:

您的标准UITextView设置应如下所示,不要忘记委托和dataDetectorTypes。

var textView = UITextView(x: 10, y: 10, width: CardWidth - 20, height: placeholderHeight) //This is my custom initializer
textView.text = "dsfadsaf www.google.com"
textView.selectable = true
textView.dataDetectorTypes = UIDataDetectorTypes.Link
textView.delegate = self
addSubview(textView)

课程结束后,添加以下内容:

class myVC: UIViewController {
    //viewdidload and other stuff here
}

extension MainCard: UITextViewDelegate {
    func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        //Do your stuff over here
        var webViewController = SVModalWebViewController(URL: URL)
        view.presentViewController(webViewController, animated: true, completion: nil)
        return false
    }
}



4> Ryan Heitner..:

对于Swift 3

textView.delegate = self

extension MyTextView: UITextViewDelegate 

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

        GCITracking.sharedInstance.track(externalLink: URL)
        return true
    }
}

或者目标是> = IOS 10

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有