请帮我解决这个问题:
重现我的问题的步骤:
-
点击";编辑我的名字"按钮
-
在.sheet内部,点击TextField,然后在键盘仍然显示的情况下,向下滚动
-
点击按钮";删除名称";
-
这是问题:
确认对话框只显示一秒钟,然后消失,不给用户任何机会(或不到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
}
}
}