1

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

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

然而,在现实世界的应用程序中,事实证明它.sheet几乎可以集成。

这里发现了两个错误:

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

错误 2:当在工作表的 SegmentPicker 内时,具有 DefaultPickerStyle 的选取器不起作用(请参阅我创建的这个 Stackoverlow-question

现在让我们关注错误 Nr1:“工作表未关闭”:

cmdpresentationMode.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 }
}
4

0 回答 0