SwiftUI:确认对话框在一秒钟后消失



请帮我解决这个问题:

重现我的问题的步骤:

  1. 点击";编辑我的名字"按钮

  2. 在.sheet内部,点击TextField,然后在键盘仍然显示的情况下,向下滚动

  3. 点击按钮";删除名称";

  4. 这是问题

    确认对话框只显示一秒钟,然后消失,不给用户任何机会(或不到1秒的机会(点击确认对话框的按钮之一

这是我的代码:

ContentView.swift

import SwiftUI
struct ContentView: View {
@State private var myName = "Joe"
@State private var isEditingName = false

var body: some View {
Text("My name is: (myName)")
Button("Edit My Name") {
isEditingName = true
}
.padding()
.sheet(isPresented: $isEditingName) {
EditView(name: $myName)
}

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

EditView.swift

import SwiftUI
struct EditView: View {
@Binding var name: String
@State private var isShowingConfirmationDialog = false

var body: some View {
Form {
Section {
TextField("Name", text: $name)
}
Section {
VStack {
ForEach(0..<50, id: .self) { number in
Text("(number)")
}
}
}
Section {
deleteNameWithConfirmationDialog
}
}
}

private var deleteNameWithConfirmationDialog: some View {
Button("Delete Name", role: .destructive) {
isShowingConfirmationDialog = true
}
.confirmationDialog("Are you sure you want to delete name?", isPresented: $isShowingConfirmationDialog) {
Button("Delete Name", role: .destructive) {
name = ""
}
Button("Cancel", role: .cancel) { }
} message: {
Text("Are you sure you want to delte name?")
}
}

}
struct EditView_Previews: PreviewProvider {
static var previews: some View {
EditView(name: .constant(String("Joe")))
}
}

如果将.confirmationDialogue移出Form:

struct EditView: View {
@Binding var name: String
@State private var isShowingConfirmationDialog = false

var body: some View {
Form {
Section {
TextField("Name", text: $name)
}
Section {
VStack {
ForEach(0..<50, id: .self) { number in
Text("(number)")
}
}
}
Section {
Button("Delete Name", role: .destructive) {
isShowingConfirmationDialog = true
}
}
}

.confirmationDialog("Are you sure you want to delete name?", isPresented: $isShowingConfirmationDialog) {
Button("Delete Name", role: .destructive) {
name = ""
}
Button("Cancel", role: .cancel) { }
} message: {
Text("Are you sure you want to delete name?")
}
}
}

如果要将.confirmationDialog保留在Form中,或者使用.confirmationDialog管理删除List中的项目,还可以通过从.swipeActions中的deleteButton中排除.destructive角色来避免立即解雇。

var body: some View {
List { // this could also be a Form
ForEach(listItems) { item in 
ItemRow(item: item) // confirmationDialog is in ItemRow
}.swipeActions { 
Button(action: { /* deleteMethodHere */ }) { 
Image(systemName: "trash") 
}.tint(.red) // to keep the swipe button red
}
}
}

相关内容

  • 没有找到相关文章

最新更新