文本字段上的 UITapGestureRecognizer 与预期不符

Posted

技术标签:

【中文标题】文本字段上的 UITapGestureRecognizer 与预期不符【英文标题】:UITapGestureRecognizer on a text field not as expected 【发布时间】:2018-05-04 14:30:53 【问题描述】:

在我的课堂上,我在一个数组 textViewRecognizer 中有 11 个 UITapGestureRecognizer,连接到数组 boxArray 中的 100 个 UITextField 中的 11 个。当点击包含 UIGestureRecognizer 的 Textfield 时,它会运行 tappedTextView 我尝试获取第一响应者的索引。

但是,由于执行操作的顺序有些奇怪,操作函数只为我提供了前一个第一响应者对刚刚被点击的响应者的第一响应者。

另外,我必须双击才能选择我想要的文本字段!我需要使用点击功能而不是文本代表,所以这真的很令人头疼。

我有……

    @objc func tappedTextField(_ sender: UITapGestureRecognizer) 
    for i in 0...99 
        if (boxArray[i]?.isFirstResponder)! 
            if let index = boxArray.index(of: boxArray[i]) 
            print(index)
            break
            
        
    

在我看来DidLoad 我有

for i in 0...10 
        textFieldTapRecognizer[i].addTarget(self, action: #selector(self.tappedTextField(_:)))

在我的课堂上

我想根据某些条件将 100 个文本字段中的 11 个设置为点击识别器(我将在这里使用常规的 for 循环)

for i in 0...10 
         boxArray[i]?.addGestureRecognizer(textFieldTapRecognizer[i])

    在点击后,我是否可以让它给我实际的第一响应者?

    是否可以通过双击来选择具有 UITapGesture 的文本字段?

非常感谢任何帮助。

已编辑:正确命名的函数

【问题讨论】:

仅供参考 - 您的问题(或者可能只是您的代码)正在引用文本字段、名为 textViewRecognizer 的变量和名为 tappedTextView 的方法。你应该正确命名事物。您使用的是文本字段还是文本视图? 好点,我正在处理文本字段。我明白这会让人感到困惑。 【参考方案1】:

听起来您想删除UITextView 上的自动编辑行为。您可以使用textViewShouldBeginEditing(_ textView: UITextView) -> Bool UITextViewDelegate 方法documented here 来获得更多控制权。

如果您为该方法返回false,这应该避免需要双击才能访问您的手势识别器。根据您的用例,您可以通过为您想要实际编辑的 textView 返回 true 来“允许”点击进入文本视图。

虽然我对您问题的第一响应者部分不是 100% 清楚,但由于 textView 如果没有启动它的编辑模式就不会抓住第一响应者,这应该可以解决我认为的问题。祝你好运!

【讨论】:

【参考方案2】:

我会将Tag 添加到我的UITextView 并将UITextViewDelegate 设置为我的ViewController

然后我将添加以下委托方法:

func textViewShouldBeginEditing(_ textView: UITextView) -> Bool 
    print("Textview tag: ", textView.tag)
    return false

【讨论】:

以上是关于文本字段上的 UITapGestureRecognizer 与预期不符的主要内容,如果未能解决你的问题,请参考以下文章

无法关闭文本字段上的键盘

iOS - 当文本字段在子视图内时,键盘上的 UIScroll 弹出到文本字段

文本字段扩展不更新屏幕上的文本 (swfit4)

搜索页面上的颤动动画文本字段

Java - 文本字段上的占位符

通过文本字段上的自动布局调整字体大小并改变高度