2017-08-16 99 views
0

我與它建立了這樣的歸因文本的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中)。有時它會記錄水龍頭,有時它不會。基本上,當我看到鏈接突出顯示時,例如當您單擊瀏覽器中的鏈接時,它不會註冊。此外,現在可以選擇我不想要的文本視圖中的文本。

回答

1

爲什麼要選擇使用輕按手勢的鏈接? 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