ios - 带有 2 个换行符的 NSmutablestring 使程序崩溃

标签 ios swift nslayoutconstraint nsmutableattributedstring

我需要创建一个以换行符开头的 Nsmutableattributed 字符串,代码如下:

let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateMutableString = NSMutableAttributedString.init(string: "\n\(dateString)")
let range = NSRange(location: 0, length: (dateString.count + 2))
dateMutableString.addAttributes([NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray], range: range)

如果我只用一个\n 开始字符串,它会使 addattributes 行上的程序崩溃,但如果我使用\n\n 则它不会破坏程序。我能知道这里到底发生了什么吗?

最佳答案

如果只有一个额外字符,则 dateString.count + 2 比字符串长,您会因为范围无效而崩溃。

为什么范围长度基于 dateString.count + 2?为什么不构建你想要的字符串,然后将该字符串传递给 NSMutableAttributedString 初始化器?然后你可以直接得到那个字符串的长度。为什么不将所需的属性传递给初始化程序,因为无论如何您都希望将它们应用于整个字符串?

除此之外,在使用 NSStringNSAttributedString 时,您不能在 Swift 字符串上使用 count 来获取长度。您需要使用 dateString.utf16.count。这是因为 NSStringNSAttributedStringNSRange 是基于 16 位字符的。

这是创建属性字符串的更简单方法,其中属性应用于整个字符串:

let dateString = TimeUtils.formatTimeOnly(from: data.date!)
let dateAttributes = [NSFontAttributeName: UIFont(name: "SourceSansPro-Regular", size: 11)!, NSForegroundColorAttributeName: UIColor.gray]
let dateMutableString = NSMutableAttributedString(string: "\n\(dateString)", attributes: dateAttributes)

关于ios - 带有 2 个换行符的 NSmutablestring 使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52436177/

相关文章:

ios - 在 UIImagePickerController 中选择图像后的 MBProgressHUD

ios - 当点击注释时用户位置的脉冲将显示警报

facebook - Xcode7 swift函数需要多少时间?比赛条件?

swift - 对 subview 的引用应该弱吗?

ios - 找出哪个 View 打破了约束

ios - 在 robovm 中打包 iPhone-Only 二进制文件

ios - UIGraphicsGetImageFromCurrentContext 并保持纵横比

ios - UICollectionView 未显示以查看

ios - Swift 编程自动布局约束问题

ios - 无法与 IB 中的约束建立导出连接