在选择器中传递参数(UIMenuController)

Passing parameter in selector (UIMenuController)

我在集合视图单元格的顶部有一个 UIMenuController 和一个 "Delete" 菜单项,当用户长按第 1 部分的单元格时显示:

@IBAction func handleLongPressOnCell(_ sender: UILongPressGestureRecognizer) {
    let p = sender.location(in: collectionView)
    guard sender.state == .began, let indexPath = self.collectionView.indexPathForItem(at: p), let cell = self.collectionView.cellForItem(at: indexPath) else { return }

    if indexPath.section == 1 {
        let frameInSuperView = collectionView.convert(cell.frame, to: view)
        let deleteItem = UIMenuItem(title: "Delete", action: #selector(deleteCell))
        UIMenuController.shared.menuItems = [deleteItem]
        UIMenuController.shared.setTargetRect(frameInSuperView, in: view)
        becomeFirstResponder()
        UIMenuController.shared.setMenuVisible(true, animated: true)
    }
}

如何将单元格的索引路径传递给下面的函数?我需要此信息才能从服务器中删除对象。

@objc internal func deleteCell(sender: UIMenuItem) {
    print("delete menu item tapped! print index path of selected collection view cell?")
}

您不能直接将信息与 selector 操作一起传递;相反,您应该将索引路径存储在您在 long-press 处理程序中设置并在删除处理程序中使用的成员变量中。

private var indexPathForDeleting: IndexPath? = nil

当不再需要变量时,不要忘记清理变量。

您可以子类化菜单项以获得必要的对象。

这里已经回答了一个例子:

Pass value through UIMenuItem of UIMenuController

正如@mkeremkeskin 指出的那样,他链接的地方有一个答案.. 但答案在 Objective-C 中,在这里你会找到一个 Swift 4 版本。

您可以子类化 UIMenuItem 并向其添加 indexPath! 我必须删除一些代码才能在我的操场上工作,但你明白了:)

class CustomMenuItem: UIMenuItem {
    var indexPath: IndexPath?

    convenience init(title: String, action: Selector, indexPath: IndexPath? = nil) {
        self.init(title: title, action: action)

        self.indexPath = indexPath
    }
}

class ViewController {

    func handleLongPressOnCell(_ sender: UILongPressGestureRecognizer) {

        let indexPath = IndexPath(item: 0, section: 1)

        if indexPath.section == 1 {
            let deleteItem = CustomMenuItem(title: "Delete", action: #selector(deleteCell), indexPath: indexPath)
            UIMenuController.shared.menuItems = [deleteItem]
            UIMenuController.shared.setMenuVisible(true, animated: true)
        }
    }

    @objc internal func deleteCell(sender: CustomMenuItem) {
        guard let indexPath = sender.indexPath else { return }

        // Delete item based on indexPath
    }
}

我是这样解决这类问题的:

let menuController = UIMenuController.shared
menuController.accessibilityHint = String(indexPath.row)


@objc func deleteCell(_ sender: UIMenuController) {
     print("delete menu item tapped! index path? \(sender.accessibilityHint)")
}

我用过swift4。希望对你有帮助。