所以我有一個按鈕,如下所示:
private var getStartedButton: some View {
Button {
showGetStartedSheet.toggle()
} label: {
Text("Get Started")
}
.sheet(isPresented: $showGetStartedSheet) {
LoginUserSheetView()
.presentationDetents([.fraction(0.70), .large])
}
}
打開LoginUserSheetView()視圖并在內部具有以下功能:
private var userCreateAccount: some View {
VStack(alignment: .center) {
Text("New MapGliders? User register")
.sheet(isPresented: $showUserRegisterSheet) {
RegisterUserSheetView()
.presentationDetents([.fraction(0.70), .large])
}
}
}
上面的代碼,然后打開另一個顯示以下代碼的作業表:
private var appleButton: some View {
Button {
// Hello
} label: {
HStack(alignment: .firstTextBaseline) {
Image(systemName: "applelogo")
Text("Hello")
}
}
}
上面的代碼(lots 已被洗掉)產生以下輸出:
https://im4.ezgif.com/tmp/ezgif-4-4ecfdb6d55.gif
正如您在上面的視頻中看到的那樣,第二張作業表在舊作業表的頂部打開,我希望該作業表被覆寫或在單個作業表上創建導航。
有誰知道我打開LoginUserSheetView()時如何關閉RegisterUserSheetView()?或者我怎樣才能使作業表被覆寫,甚至使用導航導航到打開RegisterUserSheetView()時LoginUserSheetView()。
uj5u.com熱心網友回復:
第一個選項是使用sheet(item:). 但這確實取消了作業表,并使其以新值重新出現
struct DynamicOverlay: View {
@State var selectedOverlay: OverlayViews? = nil
var body: some View {
VStack{
Text("hello there")
Button("first", action: {
selectedOverlay = .first
})
}
.sheet(item: $selectedOverlay){ passed in
passed.view($selectedOverlay)
}
}
enum OverlayViews: String, Identifiable{
var id: String{
rawValue
}
case first
case second
@ViewBuilder func view(_ selectedView: Binding<OverlayViews?>) -> some View{
switch self{
case .first:
ZStack {
Color.blue
.opacity(0.5)
Button {
selectedView.wrappedValue = .second
} label: {
Text("Next")
}
}
case .second:
ZStack {
Color.red
.opacity(0.5)
Button("home") {
selectedView.wrappedValue = nil
}
}
}
}
}
}
第二個選項沒有影片行為,但需要一個小“中間人”View
import SwiftUI
struct DynamicOverlay: View {
@State var selectedOverlay: OverlayViews = .none
@State var presentSheet: Bool = false
var body: some View {
VStack{
Text("hello there")
Button("first", action: {
selectedOverlay = .first
presentSheet = true
})
}
.sheet(isPresented: $presentSheet){
//Middle-main
UpdatePlaceHolder(selectedOverlay: $selectedOverlay)
}
}
enum OverlayViews{
case first
case second
case none
@ViewBuilder func view(_ selectedView: Binding<OverlayViews>) -> some View{
switch self{
case .first:
ZStack {
Color.blue
.opacity(0.5)
Button {
selectedView.wrappedValue = .second
} label: {
Text("Next")
}
}
case .second:
ZStack {
Color.red
.opacity(0.5)
Button("home") {
selectedView.wrappedValue = .none
}
}
case .none:
EmptyView()
}
}
}
//Needed to reload/update the selected item on initial presentation
struct UpdatePlaceHolder: View {
@Binding var selectedOverlay: OverlayViews
var body: some View{
selectedOverlay.view($selectedOverlay)
}
}
}
你可以在這里閱讀更多關于為什么需要中間視圖的內容 SwiftUI:Understanding .sheet / .fullScreenCover 生命周期 when using constant vs @Binding initializers
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/533048.html
標籤:迅速迅捷
上一篇:SwiftUI在“.”之后插入從函式接收到的欄位名稱
下一篇:以更Swift友好的方式重寫
