当用户要删除选定的表行时,我尝试显示警报视图。删除按钮是表行上下文菜单的一部分。我认为这是因为表行不是视图,但是当将警报移动到表视图时,我无法再从 ForEach 循环访问
secretItem
。那么如何从上下文菜单按钮上带有警报视图的表中删除行(对象项)
对我有什么指导吗?
struct SecretDetailView: View {
@State private var showDeleteAlert = false
var table: some View {
Table(selection: $selection, sortOrder: $sortOrder) {
TableColumn("User Name", value: \.userName)
...
} rows: {
ForEach(secretItems) { secretItem in
TableRow(secretItem)
// Menue showing up with right click on table row for row manipulation
.contextMenu {
Button("Delete Item") {
showDeleteAlert.toggle()
}
// alert not showing up here:
.alert(isPresented: $showDeleteAlert) {
Alert(
title: Text("Do you want to delete item?"),
message: Text(""),
primaryButton: .cancel(
Text("Cancel"),
action: { }
),
secondaryButton: .destructive(
Text("Delete"),
action: {deleteSelectedSecretItem(secretItem) }
)
)
}
}
}
使用接受要呈现的值的
alert
重载,例如 alert(_:isPresented:presenting:actions:)
或 alert(item:content:)
(在 iOS 17 中已弃用)。这样,您可以将 alert
修改器移动到 Table
上。
添加一个新的
@State
来存储要删除的项目,并在上下文菜单“删除”按钮的操作中设置它。
// assuming secretItems is an array of "Item"
@State private var toBeDeletedItem: Item?
.contextMenu {
Button("Delete Item") {
showDeleteAlert.toggle()
toBeDeletedItem = item
}
}
// add this to the Table
.alert("Do you want to delete item?", isPresented: $showDeleteAlert, presenting: toBeDeletedItem) { item in
Button("Delete", role: .destructive) {
deleteSelectedSecretItem(item)
}
}
或者如果您使用的是早期版本且
alert(_:isPresented:presenting:actions:)
不可用:
.alert(item: $toBeDeletedItem) { item in
Alert(
title: Text("Do you want to delete item?"),
message: Text(""),
primaryButton: .cancel(
Text("Cancel"),
action: { }
),
secondaryButton: .destructive(
Text("Delete"),
action: { deleteSelectedSecretItem(item) }
)
)
}
// You don't actually need showDeleteAlert!