[英]UITextField resigning firstResponder too early
我有兩個UITextField實例。 所述returnKeyType
第一個文本字段的是UIReturnKeyNext
,並且returnKeyType
第二文本字段UIReturnKeyDone
。 基於這個SO答案 ,我正在嘗試在單擊“下一步”按鈕時辭退第一個文本字段的第一個響應者,然后讓第二個文本字段成為第一個響應者。 當在第二個文本字段上單擊“完成”按鈕時,第一個響應者將被解除,鍵盤將消失。
以下是我的代碼:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if (textField == _textFieldOne){
[_textFieldOne resignFirstResponder];
[settingsDictionary setObject: _textFieldOne.text forKey:@"TextFieldOneInfo"];
[settingsDictionary stringValueForKey:@"TextFieldOneInfo"];
[self postNotificationSettingsUpdate:settingsDictionary];
didTestPostNotificationSettings = YES;
[_textFieldTwo becomeFirstResponder];
}
if (textField == _textFieldTwo){
[_textFieldTwo resignFirstResponder];
}
return YES;
}
單擊“下一步”按鈕時,第一個文本字段成功地重新占用第一個響應者,第二個文本字段確實成為新的第一個響應者。 但是,在單擊“完成”按鈕之前,第二個文本字段似乎立即重新簽名它的第一個響應者狀態。
任何人都可以告訴我為什么第二個文本字段在點擊“完成”按鈕之前就會重新啟動它的第一個響應者狀態? 謝謝!
編輯我已將問題縮小到以下代碼行:
[self postNotificationSettingsUpdate:settingsDictionary];
當它被注釋掉時,文本字段返回按鈕操作的行為與預期一致。
如果要切換textField,則無需調用resignFirstResponder
。 我成功地嘗試了這個:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
if (textField == _textFieldOne){
[_textFieldTwo becomeFirstResponder];
}
else if (textField == _textFieldTwo){
[textField resignFirstResponder];
}
return YES;
}
經過一番挖掘,我相信我找到了解決方案。
具體的違規行代碼如下:
[self postNotificationSettingsUpdate:settingsDictionary];
它調用以下方法:
- (void)postNotificationSettingsUpdate:(NSDictionary *) updateDict {
[self.dataCache setUserNotificationSettings:updateDict];
}
...通過網絡連接發送字典信息。
這些文本視圖存儲在UITableView行中。 在我看來發生的事情是,當調用此方法時,它重新加載了視圖。 解決方案是添加對[tableView beginUpdates];
調用[tableView beginUpdates];
和[tableView endUpdates];
在- (BOOL)textFieldShouldReturn:(UITextField *)textField
的開頭和結尾。
執行此操作后,當選擇第一個文本字段的“下一步”按鈕時,第二個文本字段將成為第一個響應者,並在選擇“完成”按鈕時將其重新簽名為第一個響應者狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.