You need to enable JavaScript to run this app. SwiftUI 点击弹窗按钮关闭弹窗并在主视图新增按钮的实现咨询
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI 点击弹窗按钮关闭弹窗并在主视图新增按钮的实现咨询

修正方案

核心问题如下:

  • 缺少showsCorrectOrIncorrect状态变量声明,会导致编译报错
  • Start Order按钮的渲染逻辑写在了弹窗组件内部,弹窗关闭后自然不会显示,需要将其移到主视图层级
  • 原实现中弹窗和主视图按钮放在同一VStack内,会出现视图挤压问题,调整为ZStack悬浮弹窗效果更符合常规交互

完整可运行修正代码

struct SelectLocation: View {
    @State private var showPopUp = false
    @State private var passCode: String = ""
    // 新增状态变量控制Start Order按钮显示
    @State private var showsCorrectOrIncorrect = false
    
    var body: some View {
        ZStack{
            VStack(spacing: 20) {
                Button(action: {
                    withAnimation {
                        self.showPopUp = true
                    }
                }, label: {
                    Text("Select Location")
                        .frame(minWidth: 0, maxWidth: 500)
                        .padding()
                        .background(Color.clear)
                        .foregroundColor(Color.black)
                        .font(.custom("Open Sans", size: 18))
                        .overlay(
                            RoundedRectangle(cornerRadius: 10)
                                .stroke(Color.gray, lineWidth: 2)
                        )
                })
                // 主视图底部新增Start Order按钮
                if showsCorrectOrIncorrect {
                    btnStart()
                }
            }
            .padding()
            
            // 弹窗改为悬浮层级,添加半透明遮罩
            if showPopUp {
                Color.black.opacity(0.3)
                    .ignoresSafeArea()
                    .onTapGesture {
                        // 可选:点击遮罩关闭弹窗
                        withAnimation {
                            showPopUp = false
                        }
                    }
                popupPassCode()
                    .transition(.opacity.combined(with: .scale))
            }
        }
    }
    
    
    func popupPassCode()-> some View {
        VStack(spacing: 20) {
            SecureField("Enter Code", text: $passCode)
                .frame(width: 300, height: 50, alignment: .leading)
                .cornerRadius(3.0)
                .overlay(RoundedRectangle(cornerRadius: 3.0)
                            .stroke(Color.gray, lineWidth: 1)
                )
                .padding(.horizontal)
            
            
            Button(action: {
                withAnimation {
                    self.showPopUp = false
                    self.showsCorrectOrIncorrect = true
                }
            }, label: {
                Text("Enter")
                    .frame(width: 150, height: 30)
                    .padding()
                    .background(Color.red)
                    .foregroundColor(Color.white)
                    .font(.custom("Open Sans", size: 28))
            })
        }
        .padding()
        .frame(width: 440, height: 300)
        .background(Color.white)
        .cornerRadius(20)
        .shadow(radius: 20 )
    }
    
    
    func btnStart() -> some View {
        Button(action: {
            // 后续添加Start Order按钮的点击逻辑
        }, label: {
            Text("Start Order")
                .frame(width: 150, height: 30)
                .background(Color.red)
                .foregroundColor(Color.white)
                .font(.custom("Open Sans", size: 28))
        })
    }
}

关键修改说明

  • 新增@State private var showsCorrectOrIncorrect = false状态变量,控制Start Order按钮的显示
  • 主视图VStack末尾添加Start Order按钮的渲染逻辑,保证按钮显示在Select Location按钮下方
  • 调整弹窗层级,放在ZStack最上层并添加半透明遮罩,避免挤压主视图内容
  • 移除弹窗内部的Start Order按钮渲染逻辑
  • 新增弹窗出场动画和点击遮罩关闭弹窗的可选交互,符合常规使用习惯

内容的提问来源于stack exchange,提问作者Honey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 16:51:02