长按 UITableView
我想处理 UITableViewCell
上的长按来打印“快速访问菜单”。 有人已经这样做了吗?
特别是 UITableView
上的手势识别?
I would like to handle a long press on a UITableViewCell
to print a "quick access menu".
Did someone already do this?
Particularly the gesture recognize on UITableView
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
首先将长按手势识别器添加到表格视图中:
然后在手势处理程序中:
您必须小心这一点,以免它干扰用户对单元格的正常点击,还要注意
handleLongPress 可能会触发多次(这将是由于手势识别器状态发生变化)。
First add the long press gesture recognizer to the table view:
Then in the gesture handler:
You have to be careful with this so that it doesn't interfere with the user's normal tapping of the cell and also note that
handleLongPress
may fire multiple times (this will be due to the gesture recognizer state changes).我使用了安娜-卡列尼娜的答案,对于一个非常严重的错误来说它几乎可以很好地工作。
如果您正在使用部分,长按部分标题会给您一个按下该部分第一行的错误结果,我在下面添加了一个固定版本(包括根据手势状态过滤虚拟调用,每个安娜·卡列尼娜的建议)。
I've used Anna-Karenina's answer, and it works almost great with a very serious bug.
If you're using sections, long-pressing the section title will give you a wrong result of pressing the first row on that section, I've added a fixed version below (including the filtering of dummy calls based on the gesture state, per Anna-Karenina suggestion).
Answer in Swift 5(Ricky 在 Swift 中的回答的延续)
Answer in Swift 5 (Continuation of Ricky's answer in Swift)
以下是结合 Dawn Song 的答案和 Marmor 的答案的澄清说明。
将长按手势识别器拖放到表格单元格中。它将跳转到左侧列表的底部。
然后以与连接按钮相同的方式连接手势识别器。
在操作处理程序中添加来自 Marmor 的代码
}
Here are clarified instruction combining Dawn Song's answer and Marmor's answer.
Drag a long Press Gesture Recognizer and drop it into your Table Cell. It will jump to the bottom of the list on the left.
Then connect the gesture recognizer the same way you would connect a button.
Add the code from Marmor in the the action handler
}
将识别器直接添加到单元格似乎更有效,如下所示:
点击并按住 TableView 单元格、当时和现在
(滚动到底部的示例)
Looks to be more efficient to add the recognizer directly to the cell as shown here:
Tap&Hold for TableView Cells, Then and Now
(scroll to the example at the bottom)
用 Swift 回答:
将委托
UIGestureRecognizerDelegate
添加到您的 UITableViewController。在 UITableViewController 中:
以及函数:
Answer in Swift:
Add delegate
UIGestureRecognizerDelegate
to your UITableViewController.Within UITableViewController:
And the function:
我根据 Anna Karenina 的出色回答在 UITableView 上整理了一个小类别。
像这样,您将拥有一个方便的委托方法,就像您在处理常规表视图时所习惯的那样。检查一下:
如果您想在 UITableViewController 中使用它,您可能需要子类化并遵守新协议。
它对我很有用,希望对其他人有帮助!
I put together a little category on UITableView based on Anna Karenina's excellent answer.
Like this you'll have a convenient delegate method like you're used to when dealing with regular table views. Check it out:
If you want to use this in a UITableViewController, you probably need to subclass and conform to the new protocol.
It works great for me, hope it helps others!
Swift 3 答案,使用现代语法,合并其他答案,并消除不需要的代码。
Swift 3 answer, using modern syntax, incorporating other answers, and eliminating unneeded code.
只需将 UILongPressGestureRecognizer 添加到 Storyboard 中给定的原型单元中,然后将手势拉到 viewController 的 .m 文件中以创建一个操作方法。
我按照我说的做到了。
Just add UILongPressGestureRecognizer to the given prototype cell in storyboard, then pull the gesture to the viewController's .m file to create an action method.
I made it as I said.
如果您正在寻找没有
@objc
的纯粹快速答案,您可以使用UITableViewDelegate
突出显示函数,而不是使用UILongPressGestureRecognizer
:对突出显示开始时间的引用,您可以轻松地在
UITableView
中实现长按检测:If you're looking for a pure-swift answer without
@objc
, you can useUITableViewDelegate
highlight functions instead of using aUILongPressGestureRecognizer
:By keeping a reference to the start-time of the highlight, you can easily implement long-press detection in your
UITableView
:使用 TouchBegan 中的 UITouch 时间戳属性启动计时器或在 TouchEnded 触发时停止计时器
Use the UITouch timestamp property in touchesBegan to launch a timer or stop it when touchesEnded got fired