Swift 3:在NSAttributedString的子字符串中获取属性

乍得

我的一个控制器有一个NSAttributeString,其中包含一个链接:

@IBOutlet var textView: UITextView!

// Below is extracted from viewDidLoad()
let linkStr = "Click <a href='http://google.com'>here</a> for good times."
let attributedText = try! NSAttributedString(
  data: linkStr.data(using: String.Encoding.unicode, allowLossyConversion: true)!,
  options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
  documentAttributes: nil)
textView.attributedText = attributedText

我正在为控制器编写单元测试,并且想要验证是否在“此处”文本上放置了正确的链接。(该链接实际上是动态生成的,这就是为什么我要对其进行测试)。

无论如何,我显然可以得到这样的未归因文本:

let text = viewController.textView.attributedText.string
// text == "Click here for good times."

我还可以通过执行以下操作从“这里”获取链接属性:

let url = uviewController.textView.attributedText.attribute(
    "NSLink", at: 6, effectiveRange: nil)
// url == A URL object for http://google.com.

问题是我必须对at参数“ 6”进行硬编码linkStr将来的价值可能会改变,因此我不想每次都更新测试。对于这种情况,我们可以假设它始终带有单词“ here”,并带有链接到该单词的链接。

因此,我想做的是找到字符“ here”所在的字符linkStr,并将该值传递给at参数,以提取NSLink属性并验证其是否指向正确的URL。但是我在使如何在Swift中使用字符串范围和索引方面遇到麻烦时遇到了麻烦。

有什么建议么?

戴维·S。

这是无需硬编码即可完成的操作。这是基于您的示例的Swift 3操场代码:

import UIKit
import PlaygroundSupport

let linkStr = "Click <a href='http://google.com'>here</a> for good times."
let attributedText = try! NSAttributedString(
    data: linkStr.data(using: String.Encoding.unicode, allowLossyConversion: true)!,
    options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
    documentAttributes: nil)

attributedText.enumerateAttribute(NSLinkAttributeName , in: NSMakeRange(0, attributedText.length), options: [.longestEffectiveRangeNotRequired]) { value, range, isStop in
    if let value = value {
        print("\(value) found at \(range.location)")
    }
}

print语句输出:

http://google.com/ found at 6

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Swift 3中从字符串中获取前四个字母?

Swift 3 NSAttributedString多个属性

如何在macOS上的Swift3中获取字符串的长度

swift 3获取子字符串的开始索引(以int表示)

如何在swift3中获取子字符串的范围?

如何在swift3中从Any获取字符串

可靠的函数可在Swift中获取子字符串在字符串中的位置

firebase子值作为数组中的字符串来填充选取器swift 3

如何在Swift中限制字符串或属性字符串中的字符数

如何在Swift 3中用链接(http)替换子字符串?

如何在Swift 4中获取子字符串?

获取Swift类的属性名称作为字符串

如何在Swift 4中搜索字符串中的子字符串?

从字符串获取结构属性-Swift

Swift-如何从给定的字符串中获取特定的子字符串

在Swift中匹配独立子字符串

在Swift中从字符串值中获取数字

在Swift 3中从对象获取字符串

如何在String数组中迭代并在Swift中获取子字符串?

Swift,将字符串保存在属性列表中

访问字符串中的字符,Swift 3.x

如何在swift 4中从特定字符到字符串末尾获取子字符串?

UITextView 未在 Swift 中显示属性字符串

从字符串 swift 3 中获取特定范围的字符

如何在swift 4中获取CATextLayer的“字符串”属性值?

Swift 4 中的子字符串

在swift中替换子字符串?

如何在swift ui中从字符串中取出子字符串?

Swift算法:如何获取包含所有子字符串而不重复的字符串