Xcode9.3.1+Swift4.1中SF Pro Text Medium代码调用崩溃求助
我之前也碰到过类似的情况,结合你的场景(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

