You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode9.3.1+Swift4.1中SF Pro Text Medium代码调用崩溃求助

解决SF Pro Text Medium字体在Swift代码中无法加载的问题

我之前也碰到过类似的情况,结合你的场景(Xcode 9.3.1 + Swift 4.1,Storyboard能用但代码崩溃),问题主要出在字体名称的准确性和强制解包的风险上,下面一步步帮你解决:

1. 先确认SF Pro Text Medium的正确字体名称

你代码里用的.SFProText-Medium可能不是系统识别的正确PostScript名称——系统字体的内部标识名有时候和我们直观认知的不一样。

你可以在AppDelegate.swift的application(_:didFinishLaunchingWithOptions:)方法里添加这段代码,打印出所有可用的字体名称:

for family in UIFont.familyNames.sorted() {
    let fontNames = UIFont.fontNames(forFamilyName: family)
    print("字体家族: \(family) → 可用字体名: \(fontNames)")
}

运行App后,在控制台里搜索SF Pro Text,你会找到类似["SFProText-Regular", "SFProText-Medium", "SFProText-Semibold"]这样的结果,把代码里的字体名改成不带开头点的SFProText-Medium。

2. 为什么Storyboard能用但代码不行?

Storyboard里Xcode会自动映射字体的显示名称到系统内部的标识名,不需要你手动写准确的PostScript名称;但代码里必须严格匹配系统识别的字体名,否则就会返回nil,加上你用了强制解包!,直接导致崩溃。

3. 永远不要强制解包字体对象

就算确认了字体名称,也建议用可选绑定来处理,避免因为iOS版本兼容性(比如某些旧系统可能没有该字体)导致崩溃:

// 正确写法
let attributes: [NSAttributedStringKey: Any]
if let mediumFont = UIFont(name: "SFProText-Medium", size: 24.0) {
    attributes = [.font: mediumFont]
} else {
    // 降级处理,用系统默认字体
    attributes = [.font: UIFont.systemFont(ofSize: 24.0, weight: .medium)]
}
let attributedString = NSAttributedString(string: "你的文本", attributes: attributes)

4. 关于Info.plist配置的说明

SF Pro系列是苹果的系统字体,不需要在Info.plist里添加Fonts provided by application配置项——这个配置是给自定义字体(你自己导入的.ttf/.otf文件)用的,系统字体默认已经被系统加载了。

按照上面的步骤修改后,你的代码应该就能正常加载SF Pro Text Medium字体了。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:47:08