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.")))
这很奇怪。
这个有效:
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.")))