2014-06-12 86 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];