父视图更新时,SwiftUI 中的工作表冻结

问题描述

使用 Swift5.3.2、iOS14.4.1、XCode12.4,

我正在 SwiftUI 中显示一个模态表。

不幸的是,每当底层父视图重新渲染/更新时,工作表就会完全冻结。

我完全不知道如何规避这个问题。有什么想法吗?

这是父视图:

import SwiftUI

struct ParentTrialView: View {
    
    @State var currentDate = Date()
    @State private var showingGrid = false
    let timer = Timer.publish(every: 10,on: .main,in: .common).autoconnect()
        
    var body: some View {
        
        NavigationView {
            Text("\(currentDate)")
                .onReceive(timer) { input in
                    currentDate = input
                }
                .toolbar {
                    ToolbarItem(placement: .navigationBarTrailing) {
                        Button(action: {
                            showingGrid.toggle()
                        }) {
                            Image(systemName: "square.grid.3x3")
                        }
                        .sheet(isPresented: $showingGrid) {                            
                            ChildTrialView(ondismiss: {
                                showingGrid = false
                            })
                        }
                    }
                }
        }
    }
}

这是子视图:

import SwiftUI

struct ChildTrialView: View {
    
    var ondismiss: () -> ()
    
    var body: some View {
        
        NavigationView {
            Text("Trial")
                .onTapGesture {                    
                    ondismiss()
                }
                .toolbar {
                    ToolbarItem(placement: .navigationBarTrailing) {
                        Button(action: {
                            ondismiss()
                        }) {
                            Text("Cancel")
                        }
                    }
                }
        }
        
    }
}

例如,如果您将计时器设置为 20 秒。然后你有 20 秒的时间在子视图上一切正常(即它的点击手势工作,以及它的取消按钮来关闭子视图工作完美)。

然而,当定时器触发对父视图的更新时,子视图上不再有任何动作!!

我对这个 SwiftUI 问题感到非常绝望。

对此有任何解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)