【问题标题】:Simulate UITextField's keyboard's return press programmatically以编程方式模拟 UITextField 的键盘的返回键
【发布时间】:2014-06-12 13:22:28
【问题描述】:

有没有办法以编程方式模拟按下“返回”键,例如调用 UITextField/UIKeyboard/用户按下返回键时调用的函数?

我知道在例程 textFieldShouldReturn 的某个地方被调用,但我认为这不是唯一发生的事情?我简单地浏览了调试器,似乎按下“return”键调用的函数不止一个。

我正在寻找的是一种拥有 UITextField 子类的方法,在这个子类中,我可以调用类似 [self.inputview returnKeyPressed] 的东西,这个函数的作用与用户按下返回键。

【问题讨论】:

  • 您想要实现什么功能?只是关闭键盘,还是以编程方式插入换行符?
  • 实际上我有一个按钮作为文本字段的右侧视图,用户除了可以选择之外还应该能够单击该按钮来触发保存/搜索/其他内容按返回键。澄清一下,我说的是 UITextField 的一个子类,它可以被任何其他控件透明地使用。目前我只是在点击按钮时调用[self.delegate textFieldShouldReturn:self],但我有点担心我需要调用的其他可能很重要的函数。

标签: ios objective-c uitextfield


【解决方案1】:

(对于希望在未来实现这一目标的任何程序员)

您可以通过将其添加到您希望“模拟”您的 Enter 按键的任何功能中来实现此目的。

    [self textFieldShouldReturn:yourTextFieldName];

您需要在 viewdidload 中设置您的文本字段委托:

[youtTextFieldName setDelegate:self];

【讨论】:

    【解决方案2】:

    我想我会做的是实现textFieldDidEndEditing: UITextFieldDelegate 方法,并实现当文本字段在那里结束编辑(保存等)时需要发生的一切。然后,您对按钮所要做的就是调用一个方法,该方法实现代码来告诉文本字段让第一响应者辞职。

    执行此操作,您将拥有一种方法来处理文本字段应结束编辑的两种方法。

    【讨论】:

    • 不幸的是,textFieldDidEndEditing 对我来说非常不可靠,因为例如,如果用户只更改输入焦点,则不应进行保存。 textFieldShouldReturn 似乎是放置自定义代码的正确位置,我宁愿调用此方法(除了我需要调用其他任何方法来模拟成熟的返回压力?)
    • @JiaYow 好吧,无论哪种方式,您都可能希望添加一个检查以查看内容是否更改,因此您选择哪个方向可能并不重要。你不应该调用这些方法中的任何一个。离开文本字段根据需要调用它们。
    【解决方案3】:

    根据:This Previous Question

    ProcessSerialNumber psn;
    GetFrontProcess( &psn );
    
    // make some key events
    CGEventRef keyup, keydown;
    keydown = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)76, true);
    keyup = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)76, false);
    
    // forward them to the frontmost app
    CGEventPostToPSN (&psn, keydown); 
    CGEventPostToPSN (&psn, keyup); 
    
    // and finally behave friendly
    CFRelease(keydown);
    CFRelease(keyup);
    

    您可以在以下位置找到十六进制字符代码列表:/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h

    【讨论】:

    • CGEventCreateKeyboardEvent 和相关 API 仅适用于 macOS。 UITextField 是一个 iOS 类,所以很遗憾,这些 API 不可用。
    • 您可以将CGEventPostToPSN替换为CGEventPost,将第一个参数替换为0,这样就不需要查找前面进程的序列号,如@987654322 @.
    【解决方案4】:

    这是一个非常古老的话题,但这个场景仍然是相关的,所以我正在回答它

    如果,并且我强调您对大 IF 的关注,您需要调用按下返回按钮背后的逻辑,那么我认为假设您已将文本字段的委托挂在某个地方,这非常简单。

    您只需要在文本字段的委托上自己调用方法

    [textfield.delegate textFieldShouldReturn];
    

    【讨论】:

      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 2019-03-06
      • 2011-09-12
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      相关资源
      最近更新 更多