使用.navigationBarTitleDisplayMode(.inline)导致Xcode预览崩溃求助
问题详情
在使用.navigationBarTitleDisplayMode(.inline)时,Xcode预览会频繁崩溃,复现步骤如下:
- 在Xcode预览界面点击
list.bullet.rectangle.fill按钮打开弹窗 - 关闭弹窗后重复操作第二次,预览直接崩溃
使用环境:Xcode 14.2 (14C18)
相关代码:
import SwiftUI struct PDFTableContentsView: View { var body: some View { Text("PDF Table Contents View") .bold() .underline() } } struct PDFContentView: View { @State private var showContents: Bool = false var body: some View { VStack { Text("Hello, World!") } .navigationTitle("PDF Title") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button { showContents.toggle() } label: { Image(systemName: "list.bullet.rectangle.fill") } } } .sheet(isPresented: $showContents) { PDFTableContentsView() } } } struct PDFContentView_Previews: PreviewProvider { static var previews: some View { NavigationView { PDFContentView() } } }
原因分析
这并非你的代码使用错误,而是Xcode 14.2预览器的已知兼容性bug——当NavigationView、.navigationBarTitleDisplayMode(.inline)和sheet组合使用时,预览环境的视图生命周期管理出现异常,导致重复打开/关闭sheet时触发崩溃。
解决方案
方案1:使用新的NavigationStack(推荐,iOS 16+)
NavigationView在iOS 16及以上已被弃用,替换为NavigationStack可彻底解决该预览崩溃问题,同时获得更稳定的导航功能:
struct PDFContentView_Previews: PreviewProvider { static var previews: some View { NavigationStack { PDFContentView() } } }
方案2:为NavigationView添加视图样式(兼容iOS 15及以下)
如果需要兼容旧系统版本,可在预览中添加.navigationViewStyle(.stack)来规避bug:
struct PDFContentView_Previews: PreviewProvider { static var previews: some View { NavigationView { PDFContentView() } .navigationViewStyle(.stack) } }
方案3:修复预览环境
若上述代码调整无效,可尝试清理Xcode缓存来修复预览器状态:
- 关闭Xcode,删除Derived Data文件夹(路径:
~/Library/Developer/Xcode/DerivedData) - 重启Xcode并重新加载预览
内容的提问来源于stack exchange,提问作者F. Zer
相关产品推荐
相关产品推荐

