当前位置: 首页 > 知识库问答 >
问题:

我怎样才能在NSA中创建一个可点击的链接?

仇睿
2023-03-14

使超链接在 UITextView 中可单击是微不足道的。您只需在IB的视图上设置“检测链接”复选框,它就会检测HTTP链接并将其转换为超链接。

然而,这仍然意味着用户看到的是“原始”链接。RTF文件和HTML都允许你设置一个用户可读的字符串,在它的“后面”有一个链接。

将属性化文本html" target="_blank">安装到文本视图(或UILabelUITextField,就此而言。)但是,当属性化文本包含链接时,它是不可单击的。

有没有办法让用户可读的文本可以在UITextViewUILabelUITextField中单击?

SO上的标记是不同的,但这里是总体思路。我想要的是这样的文本:

这个变形是用Face Dancer生成的,在app store点击查看。

我唯一能得到的是这个:

这个变形是由脸舞者生成的,点击http://example.com/facedancer在应用商店查看。

共有3个答案

郑星辰
2023-03-14

我刚刚创建了UILabel的一个子类来专门处理此类用例。您可以轻松添加多个链接,并为它们定义不同的处理程序。它还支持在触摸时突出显示按下的链接以获得触摸反馈。请参阅https://github.com/null09264/FRHyperLabel.

在您的情况下,代码可能如下所示:

FRHyperLabel *label = [FRHyperLabel new];

NSString *string = @"This morph was generated with Face Dancer, Click to view in the app store.";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]};

label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];

[label setLinkForSubstring:@"Face Dancer" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
    [[UIApplication sharedApplication] openURL:aURL];
}];

示例屏幕截图(在本例中,处理程序被设置为弹出一个警告,而不是打开一个url)

房唯
2023-03-14

我发现这很有用,但我需要在很多地方做,所以我将我的方法包装在一个简单的扩展中,扩展到NSMutableAttributedString

Swift 3

extension NSMutableAttributedString {

    public func setAsLink(textToFind:String, linkURL:String) -> Bool {

        let foundRange = self.mutableString.range(of: textToFind)
        if foundRange.location != NSNotFound {
            self.addAttribute(.link, value: linkURL, range: foundRange)
            return true
        }
        return false
    }
}

斯威夫特 2

import Foundation

extension NSMutableAttributedString {

   public func setAsLink(textToFind:String, linkURL:String) -> Bool {

       let foundRange = self.mutableString.rangeOfString(textToFind)
       if foundRange.location != NSNotFound {
           self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
           return true
       }
       return false
   }
}

示例用法:

let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")
let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")

if linkWasSet {
    // adjust more attributedString properties
}

目标C

我刚刚达到了在一个纯Objective-C项目中做同样事情的要求,所以这里是Objective-C类别。

@interface NSMutableAttributedString (SetAsLinkSupport)

- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL;

@end


@implementation NSMutableAttributedString (SetAsLinkSupport)

- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL {

     NSRange foundRange = [self.mutableString rangeOfString:textToFind];
     if (foundRange.location != NSNotFound) {
         [self addAttribute:NSLinkAttributeName value:linkURL range:foundRange];
         return YES;
     }
     return NO;
}

@end

示例用法:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:"I love stackoverflow!"];

BOOL linkWasSet = [attributedString setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"];

if (linkWasSet) {
    // adjust more attributedString properties
}
令狐良骏
2023-03-14

使用NSMutableAttributedString。

NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"Google"];
[str addAttribute: NSLinkAttributeName value: @"http://www.google.com" range: NSMakeRange(0, str.length)];
yourTextView.attributedText = str;

编辑:

这与问题没有直接关系,只是澄清一下,< code>UITextField和< code>UILabel不支持打开URL。如果您想将< code>UILabel用于链接,可以选中TTTAttributedLabel。

此外,您应该将UITextViewdataDetectorTypes值设置为UIDataDetectorTypeLinkUIDataDetectorTypeAll以在单击时打开URL。或者您可以按照评论中的建议使用委托方法。

 类似资料: