You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中.sheet()打开后自动消失并返回上一级视图问题

SwiftUI弹窗异常问题:打开Google PlacePicker后弹窗自动关闭并返回上一级视图

异常现象

点击打开Google PlacePicker的.sheet()弹窗后,弹窗立即自动关闭,同时当前「Ice Bath」视图被dismiss,直接返回至「Edit Program」视图。(动图演示流程:弹窗弹出瞬间消失,页面退回到上一级)

核心代码

struct EditNotesView: View {
    
    @State var openGooglePlaces = false
    @StateObject var viewModel: EditNotesVM
    @Environment (\.dismiss) var dismiss
    var completion: (NotesData) -> Void
    
    init(viewModel: EditNotesVM = EditNotesVM(), note: NotesData,
         bathType: ShowerPrograms,
         completion: @escaping (NotesData) -> Void) {
        
        self._viewModel = StateObject(wrappedValue: viewModel)
        viewModel.note = note
        viewModel.selectedShower = bathType
        self.completion = completion
    }
    
    var body: some View {
        ZStack {
            loadView()
        }
    }
}

extension EditNotesView {
    
    func loadView() -> some View {
        VStack {
            navigationBarView(action: {
                self.dismiss()
            }, title: Config.title)
            
            locationView()
        }
        Spacer()
        .onAppear {
            viewModel.loadProgramData()
        }
        .sheet(isPresented: $openGooglePlaces) {
            PlacePicker(address: $viewModel.address, latitude: $viewModel.latitude, longitude: $viewModel.longitude)
                .presentationDetents([.medium])
        }
    }
}

控制台提示

控制台输出显示:EditView先被销毁,进而导致PickerView被关闭。

测试验证代码(可正常运行)

struct TestView: View {
    
    @Environment(\.scenePhase) var scenePhase
    
    var body: some View {
        NavigationStack {
            NavigationLink("First Screen") {
                GooglePlaceView()
            }
        }
    }
}

struct GooglePlaceView: View {
    
    @State var openGooglePlaces = false
    @State private var address = ""
    @State private var latitude = 0.0
    @State private var longitude = 0.0

    var body: some View {
        VStack {
            Button {
                openGooglePlaces.toggle()
            } label: {
                Text("Open Google Places")
            }
        }
        .sheet(isPresented: $openGooglePlaces) {
            PlacePicker(address: $address, latitude: $latitude, longitude: $longitude)
        }
    }
}

已排查内容

已知SwiftUI中@State、@Binding或@Published属性变更会触发视图重建,甚至移除NavigationStack中的顶层视图,但已确认不存在此类变量关联导致该异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:14:53