【问题标题】:SwiftUI: Changing Light/Dark Mode in Sheet Does Not Refresh Sheet UISwiftUI:在工作表中更改亮/暗模式不会刷新工作表 UI
【发布时间】:2021-09-27 00:43:55
【问题描述】:

我想在工作表中包含系统/亮/暗模式选择器以及其他设置。

选择不同的方案确实会正确更改 ContentView 中的 UI(在工作表后面),但工作表本身会保留旧方案,必须解除并再次打开。

我做错了什么?

例子:

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var viewManager: ViewManager
    @State var showSettingsSheet = false
    
    var body: some View {
        NavigationView {
            List {
                Text("Some content 1")
                Text("Some content 2")
            }
            .toolbar {
                ToolbarItem {
                    Button(action: {
                        showSettingsSheet.toggle()
                    }){
                        Image(systemName: "gearshape.fill")
                    }
                    .sheet(isPresented: $showSettingsSheet){SettingsSheet()}
                }
            }
        }
        .preferredColorScheme(viewManager.colorScheme == "Light" ? .light : viewManager.colorScheme == "Dark" ? .dark : nil)
    }
}
struct SettingsSheet: View {
    @Environment (\.presentationMode) var presentationMode
    @EnvironmentObject var viewManager: ViewManager

    var body: some View {
        NavigationView{
            GroupBox {
                Picker("Display Mode", selection: $viewManager.colorScheme) {
                    Text("System").tag("System")
                    Text("Light").tag("Light")
                    Text("Dark").tag("Dark")
                }
                .pickerStyle(.segmented)
            }
            .toolbar {
                ToolbarItem {
                    Button(action: {
                        presentationMode.wrappedValue.dismiss()
                    }){
                        Text("Done")
                    }
                }
            }
        }
    }
}
class ViewManager: ObservableObject {
    @AppStorage("colorScheme") var colorScheme: String = "System"
}

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    您必须手动提供colorScheme,因为它在您的视图层次结构之外,即:

    struct ContentView: View {
        @EnvironmentObject var viewManager: ViewManager
        @State var showSettingsSheet = false
        
        var body: some View {
            NavigationView {
                List {
                    Text("Some content 1")
                    Text("Some content 2")
                }
                .toolbar {
                    ToolbarItem {
                        Button(action: {
                            showSettingsSheet.toggle()
                        }){
                            Image(systemName: "gearshape.fill")
                        }
                        .sheet(isPresented: $showSettingsSheet){
                          SettingsSheet()
                           .preferredColorScheme(viewManager.colorScheme == "Light" ? .light : viewManager.colorScheme == "Dark" ? .dark : nil)  // HERE
                        }
                    }
                }
            }
            .preferredColorScheme(viewManager.colorScheme == "Light" ? .light : viewManager.colorScheme == "Dark" ? .dark : nil)
        }
    }
    

    【讨论】:

    • 快到了!这在切换到浅色或深色模式时可以正常工作,但在切换回系统时不能正常工作。有什么想法吗?
    • 你是对的。我玩过它,但它在 .sheet 上不起作用。似乎是 iOS 15 的众多问题之一。我什至尝试手动将 UIApplication.shared.windows.first?.overrideUserInterfaceStyle 设置为“.unspecified”,但没有任何结果。该问题仅在工作表消失之前发生。我的建议是在以下链接(stackoverflow.com/questions/65798263/…
    猜你喜欢
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多