簡體   English   中英

我可以使用 SwiftUI 工作表視圖中的按鈕(出現在我的主 SwiftUI 視圖頂部)來更改主視圖內的子視圖嗎?

[英]Can I use a button inside a SwiftUI sheet view that appears on top of my main SwiftUI view to change a subview inside the main view?

我正在嘗試使用彈出菜單(當用戶觸發它時出現)使我的應用程序的用戶能夠更改在Subview1Subview2之間顯示在我的主視圖中的子視圖。

我正在嘗試使用全局Bool變量來做到這一點,當按下工作表內視圖中的按鈕時,這些變量會發生變化。 基於這些值,主視圖應返回不同的子視圖

問題是,當我嘗試 select 從工作表內顯示的視圖中選擇一個選項時,執行Button的操作並關閉工作表,但主視圖顯示的子視圖保持不變

有沒有辦法更改子視圖或重新加載主視圖?

我用於主視圖的代碼是:

struct ContentView: View {
    
    @State var showMenu = false
    
    var body: some View {
        
        if(subview1Selected){
            return AnyView(SubView1())
        } else if (subview2Selected){
            return AnyView(SubView2())
        }
        else {
            return AnyView(
            Button(action: {
                showMenu = true
            })
            {
                Text("Button")
            }
                .sheet(isPresented: $showMenu, content: {
                    MenuView()
                })
            )
        }
    }

我用於像菜單一樣使用的彈出表的代碼是:

struct MenuView: View {
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        List{
            Button(action: {
                subview1Selected = true
                subview2Selected = false
                self.presentationMode.wrappedValue.dismiss()
            })
            {
                Text("Subview1")
            }
            
            Button(action: {
                subview2Selected = true
                subview1Selected = false
                self.presentationMode.wrappedValue.dismiss()
            })
            {
                Text("Subview2")
            }
        }
    }
}

子視圖是:

struct SubView1: View {
    
    @State var showMenu = false
    
    var body: some View {
        Button(action: {
            showMenu = true
        })
        {
            Text("SubView1")
        }
            .sheet(isPresented: $showMenu, content: {
                MenuView()
            })
    }
}

和:

struct SubView2: View {
    
    @State var showMenu = false
    
    var body: some View {
        Button(action: {
            showMenu = true
        })
        {
            Text("SubView2")
        }
            .sheet(isPresented: $showMenu, content: {
                MenuView()
            })
    }
}

我認為這就是你想要做的。 您可以將@State showMenu 變量作為@Binding 變量傳遞到菜單中。 如果您只有 2 個視圖,則可以使用 Bool,但使用我為您添加的自定義枚舉更實用。 此外,菜單按鈕可能應該與子視圖分開。

struct ContentView: View {
    
    enum SubViewOption {
        case subview1
        case subview2
    }
    
    @State var showMenu = false
    @State var subviewSelected: SubViewOption?
    
    var body: some View {
        ZStack() {
            switch subviewSelected {
            case .subview1:
                SubView1()
            case .subview2:
                SubView2()
            default:
                Text("Select a view to begin.")
            }
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .overlay(
            Button(action: {
                showMenu.toggle()
            }, label: {
                Text("Menu")
                    .padding()
                    .frame(maxWidth: .infinity)
                    .foregroundColor(.white)
                    .background(Color.gray.cornerRadius(30))
                    .padding()
            })
            , alignment: .bottom
        )
        .sheet(isPresented: $showMenu, content: {
            MenuView(subviewSelected: $subviewSelected)
        })
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct MenuView: View {
    @Environment(\.presentationMode) var presentationMode
    @Binding var subviewSelected: ContentView.SubViewOption?
    
    var body: some View {
        List {
            
            Button(action: {
                subviewSelected = .subview1
                presentationMode.wrappedValue.dismiss()
            }, label: {
                Text("Subview1")
            })
            
            Button(action: {
                subviewSelected = .subview2
                presentationMode.wrappedValue.dismiss()
            }, label: {
                Text("Subview2")
            })
        }
    }
}

struct SubView1: View {
        
    var body: some View {
        ZStack {
            Color.red
                .edgesIgnoringSafeArea(.all)
            
            Text("THIS IS SUBVIEW 1")
                .foregroundColor(.white)
        }
    }
}

struct SubView2: View {
        
    var body: some View {
        ZStack {
            Color.blue
                .edgesIgnoringSafeArea(.all)
            
            Text("THIS IS SUBVIEW 2")
                .foregroundColor(.white)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM