为什么我的游乐场在NSRange()上崩溃

时间:2018-11-13 16:13:06

标签: swift nsattributedstring nsrange nsmutableattributedstring

我正在尝试学习NSMutableAttributedStringNSAttributedString,所以我创建了一个简单的游乐场来尝试一些事情。但是,即使看了SO上的许多示例(例如其他地方的hereNSRange from Swift Range?),我仍然有几个问题无法解决。

问题在于length属性。如果将长度指定为attribLabelText.length,则会导致未捕获的异常。如果我指定attribLabelText.length - 1没有错误,但是只有字母“ Repor”具有我要设置的属性:

enter image description here

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        let label = getLabel1(labelText: "Report")
        view.addSubview(label)
        self.view = view
    }
}

func getLabel1(labelText: String) -> UILabel {
    let label = UILabel()
    label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
    label.textColor = .black

    let attribLabelText: NSMutableAttributedString = NSMutableAttributedString(string: labelText)
    let attributes = [
        NSAttributedString.Key.foregroundColor : UIColor.gray.cgColor,
        NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 14)
        ] as [NSAttributedString.Key : Any]

    attribLabelText.addAttributes(attributes, range: NSRange(location: 0, length: attribLabelText.length)) <-- this causes an uncaught exception of type NSException

    label.attributedText = attribLabelText

    return label
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

我感觉这将是显而易见的,但是我没有尝试的想法。有人可以指出我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

您应该传递UIColor作为前景色,而不是CGColor

在绘制字符串时,UILabel似乎根据该属性是覆盖字符串的整个范围还是仅覆盖子范围,来使用前景色属性。

当属性覆盖整个字符串时使用的版本仅适用于UIColor,但是当属性仅覆盖子字符串时使用的版本似乎也适用于CGColor(尽管此行为不是记录下来,因此不应该依赖它),这解释了为什么在范围内添加-1可以避免异常。