触摸向下/向上并在UITableViewController中滚动

时间:2014-10-27 01:24:37

标签: ios swift ios8

我在搞清楚方面有点痛苦。

我有一个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

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,幸运的是,我能够解决这个问题。如果某些事情在这里可能不理想,我会喜欢一些批评/建议,但我所做的就是将它添加到我的子类文本域中:

 override func canBecomeFirstResponder() -> Bool {
     performMyFunctionHere()
    return false
  }

所以我在第一响应者上返回false,这会阻止任何类型的键盘出现(这是我想要的),而是使用performMyFunctionHere()我可以做我想做的事情(在我的情况下,让一个动作表选择器出现)。我在视图控制器中分配了操作表选择器,并将其分配给我的子类uitextfield的每个特定实例。说实话,没有什么比这更复杂了。我很惊讶它的效果和它一样。

顺便说一下,似乎并不是非常重要的一件事是设置了如上所述的delaysContentTouches。我想因为现在它正在使用响应器它总能工作吗?我是否删除它似乎并不重要,但是想知道是否更好地留下它是否更好。

谢谢!