单击 TableRow 上下文菜单按钮时不显示 SwiftUI 警报视图

问题描述 投票:0回答:1

当用户要删除选定的表行时,我尝试显示警报视图。删除按钮是表行上下文菜单的一部分。我认为这是因为表行不是视图,但是当将警报移动到表视图时,我无法再从 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) }
                            )
                        )
                    }
                }
        }
swiftui core-data alert
1个回答
0
投票

使用接受要呈现的值的

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!
© www.soinside.com 2019 - 2024. All rights reserved.