NSMutableAttributedString与自定义字体崩溃

时间:2018-01-23 17:05:51

标签: ios swift uifont nsmutableattributedstring

这很奇怪。

这有效:

titleLabel.font = UIFont(name: "OpenSans-Regular", size: 14)

这有效:

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans-Bold", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Forgot your password? Reset it here")))

这不是。发生了崩溃:

  

在打开可选值时意外发现nil

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans-Regular", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect."))). 

第一个示例显示OpenSans-Regular在应用程序中正常工作。 (第3个例子中使用相同的字体)。

第二个示例显示属性字符串可以正常使用自定义字体。

第三个示例显示带有自定义字体的属性字符串不起作用。

我仔细检查过,OpenSans-Regular我在我的项目中正确复制了:

项目目录:

enter image description here

复制捆绑资源:

enter image description here

Info.plist:

enter image description here

2 个答案:

答案 0 :(得分:3)

这可以避免应用程序崩溃。强行解开UIFont可能是应用程序崩溃的原因。试试看,看看。

if let openSansRegularFont18 = UIFont(name: "OpenSans-Regular", size: 18) {
   attributedString.addAttribute(NSFontAttributeName, value:
    openSansRegularFont18,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect.")))
} else {
  print("OpenSans-Regular is nil (not installed/added in your project)")
  // Font file name differs from the actual font name.  Use font name as "OpenSans" only.
}

答案 1 :(得分:3)

您只是没有正确添加名称为"OpenSans-Regular"的字体,

第一行,第一行:

titleLabel.font = UIFont(name: "OpenSans-Regular", size: 14)

有效,因为titleLabel.font是可选的,因此将UIFont(name: "OpenSans-Regular", size: 14)评估为nil没有问题。因此,它无法证明"OpenSans-Regular"已正确添加。

然而,在第三个例子中:

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans-Regular", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect.")))

这里你强行打开它(在!的末尾注意UIFont(name: "OpenSans-Regular", size: 18)!),因此它会崩溃 - 另一方面证明你没有正确添加它。

修改

确保正确地将"OpenSans-Regular"添加到项目中。我建议在blog entry处查看列表,特别是那里的5号检查点(名称)。

编辑2

正如@rmaddy所指出的,"OpenSans-Regular""OpenSans" - 请参阅this question。因此,请使用:

titleLabel.font = UIFont(name: "OpenSans", size: 14)

attributedString.addAttribute(NSFontAttributeName, value:
    UIFont(name: "OpenSans", size: 18)!,
    range: ((attributedString.string as NSString).range(of: "Email or password are incorrect.")))