首页 > 解决方案 > SwiftUI App 在按钮点击时不显示工作表

问题描述

我正在创建一个 SwiftUI 应用程序,并希望添加一个设置屏幕,当点击齿轮图标时该屏幕将显示为模式表。由于某种原因,当应用程序在设备或模拟器上运行时点击齿轮时,不会出现工作表。但是,当我运行它时,它确实出现在 Xcode Preview 中。

我在下面包含了整个 ContentView 代码,并使用应该显示工作表的按钮突出显示了部分。SettingsPage() 只是普通的 SwiftUI 模板,上面写着 Hello, World。

谢谢。

struct ContentView: View {
    
    @StateObject var locationViewModel = LocationManager()
    @State private var showMoreInfo: Bool = false
    @State private var showingTopSpeed: Bool = false
    
    @State var showingSettingsScreen: Bool = false
    
    private var currentSpeed: String = "Your current speed is:"
    private var topSpeed: String = " Your top speed is:"
    
    var body: some View {
        VStack {
            HStack(alignment: .lastTextBaseline) {
                GPSStrengthView(horizontalAccuracy: locationViewModel.userHorizontalAccuracy)
                Spacer()
                Button(action: {
                    withAnimation {
                        showingTopSpeed.toggle()
                        print("Toggling showing top speed")
                    }
                })  {
                    Image(systemName: "speedometer")
                        .foregroundColor(showingTopSpeed ? .primary : .accentColor)
                }
                Button(action: {
                    withAnimation {
                        showMoreInfo.toggle()
                    }
                }) {
                    Image(systemName: "filemenu.and.selection")
                        .renderingMode(.original)
                }

//BUTTON IN QUESTION ####################################

                Button(action: {
                    showingSettingsScreen = true
                }) {
                    Image(systemName: "gear")
                } .sheet(isPresented: $showingSettingsScreen, content: {
                    SettingsPage()
                })

//############################################

            }
            .padding(.leading)
            .padding(.trailing)
            Spacer()
            Text(showingTopSpeed ? currentSpeed : topSpeed)
            SpeedView(speed: showingTopSpeed ? locationViewModel.userSpeed : locationViewModel.userTopSpeed)

            if showMoreInfo {
                Text(String(format: "With an accuracy of: +/- %.2f", locationViewModel.userSpeedAccuracy * 2.236936))
                    .animation(.easeInOut)
            }
            
            Spacer()
            
            HStack {
                Spacer()
                CompassView()
                    .scaleEffect(scaleVar)
                    .frame(width: frameDimensions, height: frameDimensions)
            }
            .padding()
        }
    }

标签: iosxcodeswiftui

解决方案


尝试将您的 .sheet() 移动到最外层的 VStack,而不是将其直接应用于 Button

struct ContentView: View {
    
    @StateObject var locationViewModel = LocationManager()
    @State private var showMoreInfo: Bool = false
    @State private var showingTopSpeed: Bool = false
    
    @State var showingSettingsScreen: Bool = false
    
    private var currentSpeed: String = "Your current speed is:"
    private var topSpeed: String = " Your top speed is:"
    
    var body: some View {
        VStack {
            HStack(alignment: .lastTextBaseline) {
                GPSStrengthView(horizontalAccuracy: locationViewModel.userHorizontalAccuracy)
                Spacer()
                Button(action: {
                    withAnimation {
                        showingTopSpeed.toggle()
                        print("Toggling showing top speed")
                    }
                })  {
                    Image(systemName: "speedometer")
                        .foregroundColor(showingTopSpeed ? .primary : .accentColor)
                }
                Button(action: {
                    withAnimation {
                        showMoreInfo.toggle()
                    }
                }) {
                    Image(systemName: "filemenu.and.selection")
                        .renderingMode(.original)
                }

//BUTTON IN QUESTION ####################################

                Button(action: {
                    showingSettingsScreen = true
                }) {
                    Image(systemName: "gear")
                }

//############################################

            }
            .padding(.leading)
            .padding(.trailing)
            Spacer()
            Text(showingTopSpeed ? currentSpeed : topSpeed)
            SpeedView(speed: showingTopSpeed ? locationViewModel.userSpeed : locationViewModel.userTopSpeed)

            if showMoreInfo {
                Text(String(format: "With an accuracy of: +/- %.2f", locationViewModel.userSpeedAccuracy * 2.236936))
                    .animation(.easeInOut)
            }
            
            Spacer()
            
            HStack {
                Spacer()
                CompassView()
                    .scaleEffect(scaleVar)
                    .frame(width: frameDimensions, height: frameDimensions)
            }
            .padding()
        }
        .sheet(isPresented: $showingSettingsScreen, content: {
                    SettingsPage()
        })
    }

推荐阅读