github: ContinueFirsterResponder
iOS 界面刷新時(shí) 保持UITextField UITextView UISearchBar 響應(yīng),保持鍵盤一直打開,并可在刷新后指定定位到某輸入框作為第一響應(yīng)者
只需要一行代碼即可
使用
將
UIView+RZContinueFirstResponder.h
UIView+RZContinueFirstResponder.m
文件放到自己的項(xiàng)目中
在需要使用的地方添加
#import "UIView+RZContinueFirstResponder.h"
- 如果界面刷新時(shí),無新增或刪除文本框,則不需要做任何處理,直接使用
// 刷新方法寫這里,將保持之前的第一響應(yīng)的文本框
[_tableView rzContinueFirstResponderAndExecuteCode:^(UIViewResponderHelper *nextResponder) {
// 將刷新界面的方法寫到這里,不用擔(dān)憂這里會有block循環(huán)引用的問題
[_tableView reloadData];
}];
- 如果界面刷新時(shí),有新增或刪除文本框,如果新增的文本框在最后面,也可以不做任何處理
// 刷新方法寫這里,將保持之前的第一響應(yīng)的文本框
[_tableView rzContinueFirstResponderAndExecuteCode:^(UIViewResponderHelper *nextResponder) {
// 將刷新界面的方法寫到這里,不用擔(dān)憂這里會有block循環(huán)引用的問題
[_tableView reloadData];
}];
- 如果界面刷新時(shí),文本框較復(fù)雜,有新增或刪除文本框,又需要精準(zhǔn)的定位還原到刷新前的第一響應(yīng)者身上,則可設(shè)置文本框的tagIdentity。 具體意思可參考DemoTableViewCell中文本框_textField的設(shè)置方法
// 初始化文本框時(shí)
- (void)setModelType:(ItemModelType )type {
_textField.enabled = YES;
switch (type) {
case ItemModelTypeDefault: {
_textField.tagIdentity = @"ItemModelTypeDefault";
_textField.placeholder = @"默認(rèn)";
break;
}
case ItemModelTypeName: {
_textField.tagIdentity = @"ItemModelTypeName";
_textField.placeholder = @"ItemModelTypeName";
break;
}
case ItemModelTypeSex: {
_textField.tagIdentity = @"ItemModelTypeSex";
_textField.placeholder = @"ItemModelTypeSex";
break;
}
case ItemModelTypeDefault1: {
_textField.tagIdentity = @"ItemModelTypeDefault1";
_textField.placeholder = @"ItemModelTypeDefault1";
_textField.enabled = NO;
break;
}
case ItemModelTypeDefault2: {
_textField.tagIdentity = @"ItemModelTypeDefault2";
_textField.placeholder = @"ItemModelTypeDefault2";
break;
}
default:
break;
}
}
// 刷新方法寫這里,將保持之前的第一響應(yīng)的文本框
[_tableView rzContinueFirstResponderAndExecuteCode:^(UIViewResponderHelper *nextResponder) {
// 將刷新界面的方法寫到這里,不用擔(dān)憂這里會有block循環(huán)引用的問題
[_tableView reloadData];
}];
- 如果刷新之后,需要將第一響應(yīng)的光標(biāo)放到其他指定的文本框中,可以在刷新方法中設(shè)置
// 刷新方法寫這里,將尋找指定的下一個(gè)文本框
[_tableView rzContinueFirstResponderAndExecuteCode:^(UIViewResponderHelper *nextResponder) {
// 將刷新界面的方法寫到這里,不用擔(dān)憂這里會有block循環(huán)引用的問題
[_tableView reloadData];
// 下邊兩個(gè)方法,二選一
// 如果對應(yīng)nextFirstResponderIndex 或者 nextFirstResponderTagIdentity 找不到,則會找刷新前的那個(gè)繼續(xù)作為第一響應(yīng)
// 如果刷新前的那個(gè)也找不到了,則會按照刷新前的那個(gè)的index繼續(xù)往下找,找不到的時(shí)候,以最后一個(gè)文本框作為第一響應(yīng)
// nextResponder.nextFirstResponderIndex = 3; // 指定刷新后按從上到下(從左到右)依次序排到第n個(gè)為第一響應(yīng)
nextResponder.nextFirstResponderTagIdentity = @"ItemModelTypeDefault2"; // 指定刷新后此id為第一響應(yīng)
}];