如何在 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
我有一些代码可以在按下 UITableView 中的单元格时启动一个操作 sheet。它在 phone 上运行良好,但在 iPad 上运行失败。我看到其他人遇到这个问题,需要以某种方式重新配置他们的操作 sheet 警报代码,但我所看到的只是在按下按钮时触发操作 sheet。我看过
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 |
---|---|