使用 NavigationView 返回上一个视图时,SwiftUI 工作表视图不会出现

问题描述 投票:0回答:1

我有 NavigationLink,它使用带有显示sheetView的按钮的NavigationView来引导自己的视图。

移动到目标视图并显示sheetView后,返回上一个视图,那么即使您点击按钮,sheetView也不会出现。

如果再次移至目标视图,无需点击按钮即可显示工作表。

我做错了什么?

struct MainView: View {
    
    var body: some View {
        ZStack {
            
            NavigationView {
                DestinationView()
                    .navigationTitle("Home")
                    .navigationBarTitleDisplayMode(.inline)
            }
            AddButton()
        }
    }
}

struct DestinationView: View {
    
    @EnvironmentObject var model : Model

    var body: some View {
        List {
            
            NavigationLink(destination:
                            DestinationView().navigationTitle("Test")) {
                Text("Go to Next View")
            }
        }
        .sheet(isPresented: $model.isShowingSheet) {
            Text("SheetView")
        }
    }
}

struct AddButton: View {
    
    @EnvironmentObject var model : Model
    
    var body: some View {
        
            Button(action: {
                model.isShowingSheet = true
            }) {
                Image(systemName: "plus.circle")
                    .imageScale(.large)
            }
    }
}

class Model: ObservableObject {
    @Published var isShowingSheet: Bool = false
}

我不想将sheetView添加到MainView或AddButton。

提前致谢。

swift swiftui navigation
1个回答
0
投票

返回并点击按钮时看不到

sheet
的原因是 它会呈现在另一个视图中,因为您使用 same
model.isShowingSheet
变量无处不在。

您可以尝试不同的方法,其中每个

DestinationView
控制其 拥有独立
isShowingSheet
状态,然后将
ZStack
移动到该状态。

示例代码:

struct MainView: View {
    
    var body: some View {
        NavigationStack {
            DestinationView()
                .navigationTitle("Home")
                .navigationBarTitleDisplayMode(.inline)
        }
    }
 
}

struct DestinationView: View {
    @State private var isShowingSheet: Bool = false
    
    var body: some View {
        ZStack {
            List {
                NavigationLink(destination: DestinationView().navigationTitle("Test")) {
                    Text("Go to Next View")
                }
            }
            Button(action: {
                isShowingSheet = true
            }) {
                Image(systemName: "plus.circle")
                    .imageScale(.large)
            }
        }
        .sheet(isPresented: $isShowingSheet) {
            Text("SheetView")
        }
    }
}

编辑-1:

如果你真的想使用单独的

AddButton
,那么你可以这样做:

struct DestinationView: View {
    @EnvironmentObject var model: Model

    @State private var isShowingSheet: Bool = false
    
    var body: some View {
        ZStack {
            List {
                NavigationLink(destination: DestinationView().navigationTitle("Test")) {
                    Text("Go to Next View")
                }
            }
            AddButton(isShowingSheet: $isShowingSheet) // <--- here
        }
        .sheet(isPresented: $isShowingSheet) {
            Text("SheetView")
        }
    }
}

struct AddButton: View {
    @EnvironmentObject var model: Model

    @Binding var isShowingSheet: Bool  // <--- here
    
    var body: some View {
        Button(action: {
            isShowingSheet = true
        }) {
            Image(systemName: "plus.circle")
                .imageScale(.large)
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.