我在搞清楚方面有点痛苦。
我有一个uitableviewcontroller,每个单元格都是静态的。每个单元格内部都是一个文本框。当用户点击文本框时,我想要触发一个事件。
因此,虽然我希望我的桌子仍然可以滚动,但我也喜欢在您粘贴文本框时点按活动。
显然,在uitableviews中,它们会给您的点击添加一个延迟,因此您必须将手指向下按住一秒左右才能点击“点击”。注册。我觉得这对用户来说并不直观,所以我这样做是为了解决它:
for subview in self.tableView.subviews as [UIView]
{
if subview is UIScrollView
{
let scroll = subview as UIScrollView
scroll.delaysContentTouches = false
break
}
}
这很有效,现在当我点击我的文本框时,它会立即执行我的点击事件!然而,现在的问题是我的一些文本框位于用户自然滚动的位置。当他们用手指向下(触摸事件)进行滚动时,不幸的是,它被点击事件拦截,并阻止滚动而是执行我的事件。
我真正想要的是,如果用户放下手指,然后滑动,它就不会执行触地事件。我认为是聪明的并且将触摸切换到触摸,但是当我把手指放下然后将其取回时,它什么也没做(内部触摸似乎什么都不做)。我读到这是因为它只适用于按钮和类似的东西,而不是文本字段。所以,是的,现在我可以在没有动作的情况下滚动,但是当我点击文本框并抬起手指时,它也不会执行。
关于如何
的任何想法1)允许触摸和滚动共存,而不必按住我的手指一秒钟并处理delayContentTouches?
2)当我点击文本框时,不知怎的在内部事件中点击了什么?
我在这里看到了一些信息,但似乎没有多大帮助: UIButton inside UITableViewCell steals touch from UITableView
谢谢!
答案 0 :(得分:0)
好吧,幸运的是,我能够解决这个问题。如果某些事情在这里可能不理想,我会喜欢一些批评/建议,但我所做的就是将它添加到我的子类文本域中:
override func canBecomeFirstResponder() -> Bool {
performMyFunctionHere()
return false
}
所以我在第一响应者上返回false,这会阻止任何类型的键盘出现(这是我想要的),而是使用performMyFunctionHere()我可以做我想做的事情(在我的情况下,让一个动作表选择器出现)。我在视图控制器中分配了操作表选择器,并将其分配给我的子类uitextfield的每个特定实例。说实话,没有什么比这更复杂了。我很惊讶它的效果和它一样。
顺便说一下,似乎并不是非常重要的一件事是设置了如上所述的delaysContentTouches。我想因为现在它正在使用响应器它总能工作吗?我是否删除它似乎并不重要,但是想知道是否更好地留下它是否更好。
谢谢!