代码之家  ›  专栏  ›  技术社区  ›  JFS

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

  •  2
  • JFS  · 技术社区  · 1 年前

    当用户要删除选定的表行时,我尝试显示一个警报视图。删除按钮是表格行上下文菜单的一部分。我认为这是因为表行不是视图,但当将警报移动到我无法访问的表视图时 secretItem 从ForEach循环中删除。因此,如何从上下文菜单按钮上具有警报视图的表中删除行(对象项)

    有什么指导吗?

    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) }
                                )
                            )
                        }
                    }
            }
    
    1 回复  |  直到 1 年前
        1
  •  2
  •   Sweeper    1 年前

    使用 alert 接受要呈现的值的重载,例如 alert(_:isPresented:presenting:actions:) alert(item:content:) (在iOS 17中已弃用)。通过这种方式,您可以移动 警觉的 修改器位于 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)
        }
    
        Button("Cancel", role: .cancel) { }
    }
    

    或者,如果您使用的是早期版本,并且 警报(_:呈现:呈现:操作:) 不可用:

    .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!