2014-06-12 60 views
1

有没有一种方法可以以编程方式模拟按下“返回”键,例如,调用由UITextField/UIKeyboard调用的函数/无论用户何时按下返回键?模拟UITextField的键盘以编程方式返回按下

我知道在例程textFieldShouldReturn内部的某处被调用,但我认为这不是唯一发生的事情?我简单地介绍了调试器,看起来按下“返回”键可以调用远远多于一个函数。

我在寻找的是一种有UITextField子类的方法,在这个子类中,我可以调用类似[self.inputview returnKeyPressed]的东西,而且这个函数的功能与用户在返回时按下的功能完全一样键。

+1

你想虽然实现哪些功能?只要解雇键盘,或以编程方式插入换行符? –

+0

实际上,我有一个按钮作为文本框的右侧视图,除了可以按下返回键之外,用户还应该能够单击该按钮来触发保存/搜索/任意。为了澄清,我正在谈论UITextField的一个子类,它可以被任何其他控件透明地使用。目前我只是在按钮上调用'[self.delegate textFieldShouldReturn:self]',但我有点担心我需要调用的其他函数可能很重要。 – JiaYow

回答

1

我想我会做的是实现textFieldDidEndEditing: UITextFieldDelegate方法,并实现当文本字段结束编辑(保存等)时需要发生的一切。然后,你必须为你的按钮做的是调用一个实现代码的方法来告诉文本字段退出第一响应者。

这样做,你将有一个方法来处理两个方法,你的文本字段应该结束编辑。

+0

不幸的是,'textFieldDidEndEditing'对我来说是相当不可靠的,因为例如如果用户只改变输入焦点,则不应该发生保存。 'textFieldShouldReturn'似乎是放置自定义代码的正确位置,我宁愿调用这个方法(除了我需要调用的其他模拟函数来模拟完全返回新闻吗?) – JiaYow

+0

@JiaYow那么无论哪种方式可能会想要添加一个检查来查看内容是否发生了变化,所以它可能与您所使用的方向无关。而且你不应该调用任何这些方法。留下文本字段根据需要调用它们。 –

1

按: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

+0

'CGEventCreateKeyboardEvent'和相关的API仅适用于macOS。 'UITextField'是一个iOS类,所以这些API不可用,不幸的是。 – BinaryNate

2

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

可以实现这通过添加这个在你希望“模拟”你的输入键按下的任何功能。

[self textFieldShouldReturn:yourTextFieldName]; 

您将需要设置你的文本字段的委托像这样在您的viewDidLoad中:

[youtTextFieldName setDelegate:self];