Ios 在UITextView中单击NSURL

Ios 在UITextView中单击NSURL,ios,objective-c,uitextview,ios9,nsurl,Ios,Objective C,Uitextview,Ios9,Nsurl,我有一个UITextView,它跨越了我的UIView的100.0个点 在UITextView中,我使用以下函数获取链接: - (BOOL) textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange 这对于捕获某些字符非常有效,但我有一个问题:如果链接是文本视图中的最后一个字符,那么点击会一直按到该行 因此,如果我有一个文本视图,其中@test是链接: /

我有一个
UITextView
,它跨越了我的
UIView
的100.0个点

UITextView
中,我使用以下函数获取链接:

- (BOOL) textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
这对于捕获某些字符非常有效,但我有一个问题:如果链接是文本视图中的最后一个字符,那么点击会一直按到该行

因此,如果我有一个文本视图,其中@test是链接:

// The entire remainder of the line will be the link (all the white space after @test)
Hello @test

如何修复此问题?

对我来说,它只会突出显示链接。。。我错过什么了吗

更新:

通过虚拟URL,这里有一个非常黑客的解决方案:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] init];
    [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit amet, vim iuvaret blandit intellegebat ut. Solet diceret interpretaris eos cu, magna dicat explicari mei ex, cibo adversarium eu pro. Ei odio saepe eloquentiam cum, nisl case nec ut. Harum habemus definiebas et vix, est cu aeque sonet, in his salutatus repudiare deterruisset. Quo duis autem intellegat an, regione propriae et vis."]];

    NSAttributedString* dummyUrl = [[NSAttributedString alloc] initWithString:@" " attributes:@{ NSLinkAttributeName : @"http://dummy.com" }];
    NSAttributedString* url = [[NSAttributedString alloc] initWithString:@"http://stackoverflow.com" attributes:@{ NSLinkAttributeName : @"http://stackoverflow.com" }];
    [attributedString appendAttributedString:dummyUrl];
    [attributedString appendAttributedString:url];
    [attributedString appendAttributedString:dummyUrl];
    self.textView.attributedText = attributedString;
}

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    return ![URL.absoluteString isEqualToString:@"http://dummy.com"];
}
基本上,您可以强制
UITextView
将stackoverflow链接前后的点击识别为虚拟链接。由于它只是一个不可见的空间,但不幸的是,如果在stackoverflow链接之前/之后点击并按住,您将看到该空间以灰色突出显示,尽管
应与URL交互
返回

不幸的是,除非您从头开始实现自己的
UITextField
,否则您似乎无法避免这种行为

正如Tamás Zahola在前面的回答中所建议的,您可以通过在真实URL之前和之后添加“虚拟”URL来解决这个问题。但是,在虚拟链接中使用空白,而使用零宽度空间的unicode字符:

NSAttributedString* dummyUrl = [[NSAttributedString alloc] initWithString:@"\u200B" attributes:@{ NSLinkAttributeName : @"http://dummy.com" }];
[attributedString appendAttributedString:dummyUrl];
[attributedString appendAttributedString:url];
[attributedString appendAttributedString:dummyUrl];
在将textView链接到诸如textView委托、可编辑和dataDetectorTypes之类的代码之后,只需设置一些属性

下面我添加了我使用过的内容

同侧叶是一种最优秀的植物,纤毛是一种最优秀的植物,它在劳动和生活中起着暂时的作用。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡。Nam liber te Concivent to factor tum poen legum odioque civiuda

目标c }

斯威夫特
意味着你想要空白空间打开链接吗?如果代码<> @测试< /代码>链接有空白,它会突出显示剩下的吗?这只发生在iOS 9上吗?我不希望@test之后的任何内容都是可链接的,但默认情况下,它是通过在
NSAttributedString
的末尾添加
[[NSAttributedString alloc]initWithString:@“\u2063”attributes:nil]
来实现的。这确实有效。我认为它有助于属性:nil。我能理解为什么他们会这样做,因为现在很难点击是的,但是如果你点击/点击突出显示的.com右侧的20个点会怎么样?我明白你的意思。但这不仅仅是链接后的区域,也是链接左侧、上方和下方的区域。基本上,链接的点击区域延伸到可见边界之外(如果附近没有其他链接),以使点击链接更容易。如果你能定制这种行为,我会感到惊讶。所以基本上不要碰它,不要碰(也就是说,他们不会让你碰)刚刚注意到你在prezi工作?我们用来展示和获取job@chris要么你必须接受这种行为,要么试试我更新答案的黑客。老实说,我推荐前者。另外,继续使用prezi!:)
textView.delegate=self:
textView.editable = NO;  
textView.dataDetectorTypes = UIDataDetectorTypeLink;


- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
   return true;
textView1.delegate=self
textView1.editable = false
textView1.dataDetectorTypes = UIDataDetectorTypes.Link

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
    return true
}