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

时间:2018-02-21 12:14:20

标签: ios swift uimenucontroller

我有一个UIMenuController在集合视图单元格顶部有一个“删除”菜单项,当用户长按第1部分的单元格时会显示该单元格:

enter image description here

@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?")
}

3 个答案:

答案 0 :(得分:1)

您无法直接传递信息以及selector操作;相反,您应该将索引路径存储在您在长按处理程序中设置的成员变量中,并在删除处理程序中使用。

private var indexPathForDeleting: IndexPath? = nil

不要忘记做家务,并在不再需要时清除变量。

答案 1 :(得分:1)

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

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

Pass value through UIMenuItem of UIMenuController

答案 2 :(得分:0)

我以这种方式解决了这类问题:

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


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

我以前使用过swift4。希望它会有所帮助。