SwiftUI 表不会关闭

问题描述

使用 Swift5.2.3、iOS14.4.2、XCode12.4,

在 SwiftUI 中使用 .sheet 修饰符让我一开始感到很兴奋,因为它似乎是一种简单有效的显示模式表的方式。

然而,在实际应用中,.sheet 几乎可以集成。

这里发现了两个错误

错误 1:工作表不偶尔关闭

错误 2:带有 DefaultPickerStyle 的 Picker 在工作表的 SegmentPicker (See this Stackoverlow-question that I created) 中不起作用

现在让我们关注 Bug Nr1:“工作表无法关闭”:

cmd presentationMode.wrappedValue.dismiss() 应该关闭工作表。它适用于 90% 的情况。但是每隔一段时间,在不说明原因的情况下,模态表就不会关闭

这是一段代码摘录:

import SwiftUI
import Firebase

struct MyView: View {
    
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        
        vstack {
            Form {
                Section(header: Text("Login")) {
                    Button(action: {
                        UserDefaults.standard.set(true,forKey: AppConstants.UserDefaultKeys.justlogoutLoginpressed)
                        try? Auth.auth().signOut()
                        
                        // supposedly should work all the time - but it only works 90% of the time.....
                        presentationMode.wrappedValue.dismiss()
                    }) {
                        HStack {
                            Text((Auth.auth().currentUser?.isAnonymous ?? true) ? "Login" : "logout")
                            Spacer()
                        }
                    }
                }
            }
            .ignoresSafeArea()
            Spacer()
        }
    }
}

我还尝试将结束调用包装在主线程中:

dispatchQueue.main.async {
    presentationMode.wrappedValue.dismiss()
}

但这没有帮助。

知道为什么 SwiftUI .sheets 不会使用 presentationMode 关闭它吗??

在这里,我首先添加了工作表的调用方式。由于从一个更大的应用程序中取出,我显然只在这里展示了如何调用工作表的示例:

import SwiftUI

@main
struct TestKOS005App: App {

    @StateObject var appStateService = AppStateService(appState: .startup)
    
    var body: some Scene {
        WindowGroup {
            MainView()
                .environmentObject(appStateService)
        }
    }
}
class AppStateService: ObservableObject {
    
    @Published var appState: THAppState
    var cancellableSet = Set<AnyCancellable>()
    
    init(appState: THAppState) {
        
        self.appState = appState                
    }

    // ...
}

enum THAppState: Equatable {
    
    case startup
    case downloading
    case caching
    case waiting
    case content(tagID: String,name: String)
    case cleanup
}
struct MainView: View {
        
    @EnvironmentObject var appStateService: AppStateService
    @State var sheetState: THSheetSelection?
    
    init() {
        UINavigationBar.appearance().tintColor = UIColor(named: "title")
    }
    
    var body: some View {
        
        ZStack {
            NavigationView {
                
                ZStack {
                    switch appStateService.appState {
                    case .caching:
                        Text("caching")
                    case .waiting:
                        Text("waiting")
                    case .content(_,_):
                        vstack {
                            Text("content")
                            Button(action: {
                                        sheetState = .sheetType3
                                    },label: {
                                        Text("Button")
                                    })
                        }
                    default:
                        Text("no screen")
                    }
                }
                .sheet(item: $sheetState) { state in
                    switch state {
                    case .sheetType1:
                        Text("sheetType1")
                    case .sheetType2:
                        Text("sheetType2")
                    case .sheetType3:
                        MyView()
                    }
                }
            }
            .navigationViewStyle(StackNavigationViewStyle())
        }
    }
}
enum THSheetSelection: Hashable,Identifiable {
        
    case sheetType1
    case sheetType2
    case sheetType3
    
    var id: THSheetSelection { self }
}

解决方法

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...