如何在 iPadOS 的 UITableview 单元格按下时触发操作 sheet 警报

How to trigger an action sheet alert on UITableview cell press on iPadOS

我有一些代码可以在按下 UITableView 中的单元格时启动一个操作 sheet。它在 phone 上运行良好,但在 iPad 上运行失败。我看到其他人遇到这个问题,需要以某种方式重新配置他们的操作 sheet 警报代码,但我所看到的只是在按下按钮时触发操作 sheet。我看过 post,但我不知道如何实现这个提供的示例代码:

currentPopoverpresentioncontroller.sourceView = cell

这是我显示动作的函数 sheet:

    func showActionSheet() {
        let alert = UIAlertController(title: "Card Actions", message: "choose action", preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Edit", style: .default, handler: { action in
            print("edit tapped")
            self.renameDeckAlert()
    }))
        alert.addAction(UIAlertAction(title: "Delete", style: .destructive, handler: { action in
            self.showDeleteAlert()
    }))
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
    }))
        present(alert, animated: true)
}

这里是我调用函数的地方:

extension EditViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell #\(indexPath.row)")
        showActionSheet()
        self.editTableView.deselectRow(at: indexPath, animated: true)
    }
}

有人可以告诉我如何在按下表格视图中的单元格时在 iPadOS 上执行 sheet 操作吗?

您可以将所选单元格的 indexPath 传递给您的呈现函数。然后,获取带有 cellForRow(at:):

的单元格
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    showActionSheet(indexPath: indexPath) /// pass in the indexPath
    self.editTableView.deselectRow(at: indexPath, animated: true)
}

///                  ↓ add an argument label
func showActionSheet(indexPath: IndexPath) {
    let alert = UIAlertController(title: "Card Actions", message: "choose action", preferredStyle: .actionSheet)
    alert.addAction(UIAlertAction(title: "Edit", style: .default, handler: { action in
        print("edit tapped")
        
    }))
    alert.addAction(UIAlertAction(title: "Delete", style: .destructive, handler: { action in
        
    }))
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
    }))
    
    /// for iPad
    if let popoverController = alert.popoverPresentationController {
        
        /// get the cell
        let cell = tableView.cellForRow(at: indexPath)
        
        popoverController.sourceView = cell
        popoverController.sourceRect = cell?.bounds ?? CGRect(x: 0, y: 0, width: 50, height: 50)
    }
    
    present(alert, animated: true)
}

结果:

iPhone iPad