[英]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?
我正在嘗試使用彈出菜單(當用戶觸發它時出現)使我的應用程序的用戶能夠更改在Subview1
和Subview2
之間顯示在我的主視圖中的子視圖。
我正在嘗試使用全局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.