NSMutableAttributedString 使用自定义字体崩溃

NSMutableAttributedString crashing with custom font

这很奇怪。

这个有效:

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")))

这不是。崩溃:

Unexpectedly found nil while unwrapping an Optional value

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 我在我的项目中正确复制了:

项目目录:

复制捆绑资源:

Info.plist :

这将避免应用程序崩溃。强制展开 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.
}

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

的字体

第一行,行:

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

有效,因为 titleLabel.font 是可选的,因此 UIFont(name: "OpenSans-Regular", size: 14) 被评估为零没有问题。所以并不能证明"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.")))