在UITextView中单击NSURL

时间:2016-01-16 10:21:08

标签: ios objective-c uitextview ios9 nsurl

我有一个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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

对我来说,它只突出了链接......我错过了什么吗?

enter image description here

更新

这是一个真正的hacky解决方案,通过虚拟URL&#39>:

- (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链接之前/之后点击并按住,您将看到以灰色突出显示的空格,尽管shouldInteractWithURL返回{{ 1}}。 不幸的是,除非你从头开始实现自己的NO ...

,否则你似乎无法绕过这种行为

答案 1 :(得分:2)

正如TamásZahola在之前的回答中建议的那样,您可以通过在真实URL之前和之后添加“虚拟”URL来解决此问题。但是,在虚拟链接中使用空格,请使用零宽度空间unicode字符:

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

答案 2 :(得分:0)

enter image description here您只需在将textView链接到textview委托,editable和dataDetectorTypes

等代码后设置一些属性

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

  

Lorem ipsum dolor sit er elit lamet,consectetaur cillium adipisicing pecu,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam,quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat。 https://developer.apple.com/library/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson3.html Duis aute irure dolor in repreptderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 http://stackoverflow.com Excepteur sint occaecat cupidatat non proident,sunt in culpa qui officia deserunt mollit anim id est laborum。 Nam liber te conscient to factor tum poen legum odioque civiuda http://stackoverflow.com

for objective-c

textView.delegate=self:
textView.editable = NO;  
textView.dataDetectorTypes = UIDataDetectorTypeLink;


- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
   return true;

}

for Swift

textView1.delegate=self
textView1.editable = false
textView1.dataDetectorTypes = UIDataDetectorTypes.Link

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