为啥@FocusState 会导致 SwiftUI 预览崩溃

Posted

技术标签:

【中文标题】为啥@FocusState 会导致 SwiftUI 预览崩溃【英文标题】:Why @FocusState Crashing SwiftUI Preview为什么@FocusState 会导致 SwiftUI 预览崩溃 【发布时间】:2021-12-21 03:45:11 【问题描述】:

好的,我想知道为什么我的预览版在更新 Xcode 后无法正常工作。所以我有一个看起来像这样的枚举。

enum Field 
    case email
    case securedPassword
    case unsecuredPassword

现在,当我将 @FocusState 添加到我的 TestView 时,我的预览会崩溃并且不会更新。这是我的代码的样子。

struct TestView1: View 
    @FocusState var focusedField: Field?
    
    var body: some View 
        Color.blue
    

现在,当我注释掉 @FocusState 时,我可以将颜色更改为红色,并且预览会更新。当@FocusState 未被注释掉时,当我将颜色更改为新颜色时,它不会更新预览并给我一个奇怪的崩溃。

现在这是一个错误,如果是,是否有解决方法?

【问题讨论】:

看起来像 Xcode 缺陷 您是否尝试过清理项目?你能提到你正在使用的 Xcode 版本吗?顺便说一句,它对我有用,我在 Xcode 13.1 @Asperi 那么它是一个错误吗?有办法解决吗? @JarvisTheAvenger Xcode 13.2.1 是的,b4 工作正常,但我更新并预览停止工作 【参考方案1】:

请参阅我几个月前在 Apple 开发者论坛上发布的相关答案:https://developers.apple.com/forums/thread/681571?answerId=690251022#690251022。 这对你有用吗?

struct TestView1: View 
    enum Field: Hashable 
        case email
        case securedPassword
        case unsecuredPassword
    

    @FocusState var focusedField: Field?
    
    var body: some View 
        Form 
            Color.blue
        
    


struct TestView1_Previews: PreviewProvider 
    static var previews: some View 
        // Here we've wrapped `TestView1` in a `ZStack  ... ` View
        // so that it won't be the top-level View in our Preview, to avoid
        // the known bug that causes the `@FocusState` property of a
        // top-level View rendered inside of a Preview, to not work properly.
        ZStack 
            TestView1()
        
    

【讨论】:

是的,通过将 TestView1 嵌套到预览内的 ZStack 中来做到这一点。谢谢。 不客气,@LuisRamirez。我很高兴能帮上忙:)!我很确定我确实向 Apple 报告了这个错误,但它可能是我提交给他们的关于屏幕键盘未显示在 SwiftUI Preview 中运行的错误报告的一部分Xcode 在物理 iPhone 上点击 TextField 后预览应用程序,直到应用程序首先被发送到后台,然后又被带回前台... @JeremyPearson 非常感谢!!,提交了反馈意见 谢谢!我有点疯狂地试图弄清楚我做错了什么:)。我也提交了反馈。希望有很多人报告这个。 在预览中添加 ZStack 为我解决了这个问题。谢谢

以上是关于为啥@FocusState 会导致 SwiftUI 预览崩溃的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 为啥 contentShape 会阻止单击叠加层?

为啥我在 SwiftUI 中的 TextEditor 会忽略我的 .keyboardType?

每次视图出现时,SwiftUI .onAppear withAnimation 都会加快速度。为啥?

为啥这个 SwiftUI 视图会初始化两次?

为啥我的 SwiftUI JSONDecoder 会出现致命错误?

为啥在 SwiftUI Lifecycle 中将 rootViewController 设置为 UIHostingController 时会出错?