攻丝中的UITextView一个NSLinkAttributeName链接不是在iOS中工作9

问题描述:

我与它建立了这样的归因文本的UITextView攻丝中的UITextView一个NSLinkAttributeName链接不是在iOS中工作9

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"This is a message.\nClick here for more info"]; 
textView.linkTextAttributes = @{NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)}; 
NSRange linkRange = [attributedString.string rangeOfString:@"Click here for more info"]; 
[attributedString addAttribute:NSLinkAttributeName value:@"" range:linkRange]; 
textView.attributedText = attributedString; 
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(infoTapped:)]; 
[textView addGestureRecognizer:tapRecognizer 

然后我抓住一个水龙头这样的:

- (void)infoTapped:(UITapGestureRecognizer *)tapGesture { 
    if (tapGesture.state != UIGestureRecognizerStateEnded) { 
     return; 
    } 

    UITextView *textView = (UITextView *)tapGesture.view; 
    CGPoint tapLocation = [tapGesture locationInView:textView]; 
    UITextPosition *textPosition = [textView closestPositionToPoint:tapLocation]; 
    NSDictionary *attributes = [textView textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward]; 
    NSString *link = attributes[NSLinkAttributeName]; 

    if (link) { 
     // Do stuff 
    } 
} 

在iOS 10中,这工作正常,我能够检测到NSLinkAttributeName属性。 但是,在iOS 9中,拨打[textView closestPositionToPoint:tapLocation]的电话将返回nil,我无法从此处进行任何操作。

Btw。我的textview有editableselectable设置为NO。我知道有人说selctable需要设置为YES,但我不确定它是否属实。首先,它在iOS 10中无需选择就可以正常工作。其次,如果我将其设置为可选,则它可以工作,但仅适用于其他类型。我确实在iOS 9中获得了水龙头,但它只能工作不正常(在9和10中)。有时它会记录水龙头,有时它不会。基本上,当我看到链接突出显示时,例如当您单击浏览器中的链接时,它不会注册。此外,现在可以选择我不想要的文本视图中的文本。

为什么要选择使用轻按手势的链接? UITextView具有完美的链接识别功能。我无法回答为什么你的解决方案在iOS 9上无法正常工作,但我可以建议你以另一种方式处理链接。这也适用于iOS 9。

NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"This is a message.\nClick here for more info" attributes:nil]; 
NSRange range = [str.string rangeOfString:@"Click here for more info"]; 
// add a value to link attribute, you'll use it to determine what link is tapped 
[str addAttribute:NSLinkAttributeName value:@"ShowInfoLink" range:range]; 
self.textView.linkTextAttributes = @{NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)}; 
self.textView.attributedText = str; 
// set textView's delegate 
self.textView.delegate = self; 

然后实现UITextViewDelegate的链接相关的方法:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction 
{ 
    if ([URL.absoluteString isEqualToString:@"ShowInfoLink"]) { 
     // Do something 
    } 
    return NO; 
} 

要使其工作,你必须设置可选= YES,并检查链接标志在故事板能够检测环节。

+0

我真的更喜欢UITextView中的文本不能被选择,因为它有时会带来一些丑陋的行为,但是由于我无法使它在没有它的情况下工作,我选择了你的方法。 – pajevic