获取我正在触摸的文本视图在哪个 UIcollectionviewcell

Posted

技术标签:

【中文标题】获取我正在触摸的文本视图在哪个 UIcollectionviewcell【英文标题】:Getting which UIcollectionviewcell the textview im touching is in 【发布时间】:2017-01-24 08:02:23 【问题描述】:

我有一个 UICollectionView,每个单元格都有一个 UITextView。我试图在长按 TextView 中的文本并从上下文菜单中选择删除时删除整个单元格。

我知道我可以通过覆盖来覆盖 Delete

func delete(_ sender: Any?) //I want to delete cell from here

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool 
    if action == #selector(delete(_:))
    
        return true
    
    return super.canPerformAction(action, withSender: sender)

我只是不知道如何找到我所在的当前单元格。

【问题讨论】:

您可以使用 indexPath.row 为 UITextView 分配标签,并通过此标签获取单元格。 但是我怎么知道上下文菜单在哪个文本视图中呢? cellForItemAtIndexPath 中,设置cell.textView.tag = indexPath.row。在函数delete(_ sender: Any?) let textView: UITextView = sender as! UITextView; indexPath.row = textView.tag . Just call delete collectionCell method 这里的问题是发送者是一个UIMenuController,而不是UITextView 【参考方案1】:

在您的func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 中,将 indexPath.row 设置为 UITextView 的标记。然后在你的func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 或 UITextView 长按你可以访问 UITextView 的标签,这有助于找到当前的单元格。

您可以使用此代码访问当前单元格:

let indexPath = IndexPath(row: textview.tag, section: 0)
let yourCell = self.collectionView.cellForItem(at: indexPath)

希望对您有所帮助,或者您遇到任何其他问题,请告诉我:)

【讨论】:

【参考方案2】:

在将单元格添加到集合视图时,为文本字段提供标签,该标签应等于当前 indexPath。当长按监听器被触发时,检查标签值,并据此进行操作。

【讨论】:

【参考方案3】:

Swift 3 解决方案: 所以有些人很接近,但每个人都几乎把我引到了正确的道路上。该解决方案并不能完全回答我的问题,但可以结合手势识别器来具体回答问题。

所以我的解决方案基于我的代码格式,可能需要针对其他人进行调整。

首先: 从 UICollectionViewCell 子类中,当然我的 textview 是在其中实现的,我覆盖了内置的删除功能。从那里创建了一个变量,该变量使用单元格超级视图进行实例化,即 UICollectionView。这使我可以获取单元格的 indexPath。从那里我还创建了一个变量,该变量使用 UIView 实例化,用于我的 UICollectionView 所在的位置。从那里我在我的 UIView 中创建了一个函数,它接受一个 IndexPath 并删除单元格。

UICollectionViewCell 内部:

override func delete(_ sender: Any?) 
    let cv = self.superview as! UICollectionView
    let indexPath = cv.indexPath(for: self)
    let view = self.superview?.superview as! UIView
    view.delCell(indexPath!)

UIView 内部:

func delCell(indexPath: IndexPath) /*code for cell removal here*/

【讨论】:

【参考方案4】:

func deleteSections(IndexSet) 删除指定索引处的节。

func deleteItems(at: [IndexPath]) 删除指定索引路径的项目

【讨论】:

但是如何获取 indexPath。我正在尝试从 override func delete(_ sender: Any?) 您的发件人是您的索引路径。 [indexPath.row] 这里的发送者是一个 UIMenuController @EdricChen 对不起,我很困惑。您不是在问如何确定 self 以便可以将该消息发送到 UIMenuController 以处理诸如删除之类的事件吗? 我正在尝试覆盖内置的上下文菜单按钮删除,该菜单在 uitextview 中选择文本后打开,并获取我在其中打开该上下文菜单的单元格。

以上是关于获取我正在触摸的文本视图在哪个 UIcollectionviewcell的主要内容,如果未能解决你的问题,请参考以下文章

GridView 在触摸时获取项目

*当前*正在触摸哪个 SwiftUI 节点?

如何确定 UITapGestureRecognizer 触摸了哪个视图?

调度触摸事件到画布上绘制的视图

如何快速检测正在编辑哪个文本视图

表格页脚视图中的UIButton在键盘显示时没有响应触摸