代码之家  ›  专栏  ›  技术社区  ›  Chris Cleeland

为什么textfielddidediting:没有被调用?

  •  12
  • Chris Cleeland  · 技术社区  · 16 年前

    - (BOOL)textFieldShouldReturn:(UITextField*)theTextField {
        if (theTextField == thresholdValue) {
            [thresholdValue resignFirstResponder];
        }
        return YES;
    }
    
    - (void)textFieldDidEndEditing:(UITextField *)textField {
        [self updateThresholdValue:textField];
    }
    

    可能值得注意的是,我还尝试将一些textfield事件连接到委托,并让事件调用updateThresholdValue:直接进行,但这也不起作用。

    5 回复  |  直到 7 年前
        1
  •  9
  •   Miha Hribar    15 年前

    只是遇到了和你描述的相同的问题。在尝试了我能想到的一切之后,我添加了此委托方法:

    // if we encounter a newline character return
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {   
        // enter closes the keyboard
        if ([string isEqualToString:@"\n"])
        {
            [textField resignFirstResponder];
            return NO;
        }
        return YES;
    }
    

    现在,文本字段shouldendediting激发,文本字段退出第一响应程序。

    - (BOOL)textFieldShouldEndEditing:(UITextField *)textField
    {
        [textField resignFirstResponder];
        return YES;
    }
    
        2
  •  6
  •   paulthenerd    16 年前

    TextFieldDiEndediting在textfield退出其第一响应者状态时触发,而textFieldShouldReturn在按下返回按钮时触发。

    信息技术 就像你的textfield永远不会辞去第一响应者的职务一样。您可以通过放置一些调试输出(如注释中所建议的)并通过触摸导航出文本字段来非常轻松地检查它-例如开始键入,然后触摸字段外部以强制它退出第一响应者。

    不确定这是否有帮助,但听起来你遇到了一个奇怪的情况。

        3
  •  3
  •   karjaubayev    7 年前

    如果你领养了 协议,然后在 方法将上述协议的方法激活到相应的文本字段:

    override func viewDidLoad() {
        //other stuff
        yourTextField.delegate = self
    }
    
        4
  •  2
  •   Chris Cleeland    16 年前

    正如其中一条评论中提到的,我尝试复制一个简单版本的HelloWorld应用程序,在第一次尝试时就成功了,没有任何问题,正如预期的那样。面对这一点,我开始有点怀疑。

    在我试图找到这个问题答案的谷歌搜索过程中,我遇到了一个链接,其中一个人对不是从按钮触发的事件有问题,结果发现问题与按钮所在的视图有关,该视图有另一个子视图作为按钮的对等视图,子视图以某种方式吞噬了事件,而不是让它们去它们被引导的地方。这个场景和我的不完全一样,但听起来很接近,所以调查是值得的。尽管在这里收到了许多很好的建议,但没有一个取得成果。

    昨天晚上,我决定从头开始完全重新创建nib文件(复制了我首先拥有的文件),然后我让它开始工作。关键的区别似乎是,在原始的非工作nib文件中,我拖拽了一个 TableViewController 从调色板,然后将其类型更改为我的子类 PZTableViewController . 当我在我的新笔尖上做同样的事情时,事件并没有发生。另一方面,如果我移除了拖过来的 TableViewController 而是拖过一个 NSObject 并将其类别更改为 PZTableViewController 把一切都搞定了,一切都“起作用了”。

    我会尽力找到让我开始思考这一问题的链接,并将其作为编辑或评论发布。

    这也不是一个完整的答案,因为我还不了解调色板中的 TableViewController 还有我的子类。当我找到答案时,我会通过编辑或评论来更新这个答案。

        5
  •  1
  •   Anton Tropashko    9 年前

    我最终连接editingChanged来记录对文本字段的每一个更改,而不是找出如何用剩余的回调覆盖所有角落的情况。

    非常“高效”,因为textFieldDidEndEditing(讽刺)类似android的“可用性”。

        6
  •  1
  •   Rostyslav Druzhchenko    5 年前

    就我而言 textFieldDidEndEditing:(UITextField *)textField 没有调用,而是因为实现了 textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason . 由于某些原因,在iOS 13.4上它没有被调用。

    我刚把它拆下来就修好了 reason ... .

    reason 已停止工作的回调仍处于打开状态,但短回调正常工作。

    enter image description here