Существует приложение, в котором я генерирую несколько UITextFields
динамически. Я хочу отменить первого ответчика всякий раз, когда UITextFields
не выбраны (коснитесь вне UITextField
). Как я могу узнать, из чего UITextField
я должен уволить первого ответчика? Пожалуйста, укажите любой другой способ, помимо понятия "тег", потому что я пробовал это. Пожалуйста, предложите правильное направление. Заранее спасибо.
Отказ от первого ответчика для нескольких UITextFields
Ответ 1
Не вызывайте resignFirstResponder
; вызов endEditing:
!
Вызовите endEditing:
в любом представлении над текстовыми полями в иерархии представлений. Он найдет первого ответчика и попросит его уйти в отставку. Используйте endEditing:YES
, чтобы заставить его или endEditing:NO
разрешить делегату текстового поля решить, должен ли он закончить редактирование (полезно, если вы проверяете ввод).
Ответ 2
**[self.view endEditing:TRUE];** //Resign firstresponder for all textboxes on the view
Ответ 3
используйте этот код и реализуйте
-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
NSInteger nextTag = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder) {
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
} else {
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return NO; // We do not want UITextField to insert line-breaks.
}
Ответ 4
Вы можете реализовать метод делегирования
- (void)textFieldDidBeginEditing:(UITextField *)textField;
в том, что вы можете взять currentTextField = textField;
в другом методе делегата
- (BOOL)textFieldShouldReturn:(UITextField *)textField;
вы можете сделать currentTextField = nil;
вы можете отменить currentTextField....
Ответ 5
Вы можете попробовать это следующим образом:
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event {
for (id textField in self.view.subviews) {
if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder]) {
[textField resignFirstResponder];
}
}
}
Я не пробовал, но кажется хорошим решением
Ответ 6
Самый общий способ, а также единственный, который работал у меня в UITableViewController
, отправлял действие по цепочке ответчиков и ожидал, что правильный объект получит действие:
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
Протестировано в iOS8
Ответ 7
Вы можете установить textFields
в качестве свойств и синтезировать их. Вам потребуется столько свойств, сколько вы используете в своем приложении.
У вас может быть @synthesise myTextField0, myTextField1, myTextField2;
для трех текстовых полей. Просто назначьте каждый UITextField
, который вы используете для этих свойств, объявляя их.
И когда вы хотите уйти в отставку, просто используйте [self.myTextField0 resignFirstResponder]
at textFieldDidEndEditing
или какую-либо функцию, которую вы хотите отменить. И вы также можете использовать это для других текстовых полей. Это способ обработки нескольких текстовых полей
В общем, вы можете пропустить все эти шаги с помощью textField.returnKeyType = UIReturnKeyDone;
, если у вас есть ключ возврата DONE
, вы можете просто перейти к методу
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return 1;
}
или вы можете использовать tags
для пометки определенных текстовых полей, а затем отменить определенные.
Ответ 8
вы можете проверить с помощью isFirstResponder
.
В любой момент времени только один UIResponder
(UITextField
в вашем случае) может быть firstResonder
.
Ответ 9
Кстати, я сделал это по-разному. Не выглядя достаточно хорошего программирования Champ tech, но достаточно, чтобы решить мою работу.
for(UIView *v in self.view.subviews)
{
if(([v isMemberOfClass:[UITextField class]]==YES) && !(CGRectContainsPoint(v.frame,[[touches anyObject] locationInView:self.View)))
{
v.userInteractionEnabled=NO;
if([v isEditing])
{
[v resignFirstResponder];
}
}
}
Ответ 10
Используя [self.view endEditing:YES];
для resignFirstResponder для текущего активного UITextField.
Ответ 11
Это сработало для меня в Xamarin.iOS/Monotouch. Измените кнопку клавиатуры на "Далее", передайте элемент управления на следующий UITextField и спрячьте клавиатуру после последнего UITextField.
private void SetShouldReturnDelegates(IEnumerable<UIView> subViewsToScout )
{
foreach (var item in subViewsToScout.Where(item => item.GetType() == typeof (UITextField)))
{
(item as UITextField).ReturnKeyType = UIReturnKeyType.Next;
(item as UITextField).ShouldReturn += (textField) =>
{
nint nextTag = textField.Tag + 1;
var nextResponder = textField.Superview.ViewWithTag(nextTag);
if (null != nextResponder)
nextResponder.BecomeFirstResponder();
else
textField.Superview.EndEditing(true);
//You could also use textField.ResignFirstResponder(); but the above line makes some users happier (e.g. benzado)
return false; // We do not want UITextField to insert line-breaks.
};
}
}
Внутри ViewDidLoad у вас будет:
Если у вашего TextFields нет тега, установите его сейчас:
txtField1.Tag = 0;
txtField2.Tag = 1;
txtField3.Tag = 2;
//...
и просто вызов
SetShouldReturnDelegates(yourViewWithTxtFields.Subviews.ToList());
//If you are not sure of which view contains your fields you can also call it in a safer way:
SetShouldReturnDelegates(txtField1.Superview.Subviews.ToList());
//You can also reuse the same method with different containerViews in case your UITextField are under different views.
Ответ 12
У меня была проблема с Отказ от первого ответчика для выбранного UITextField из нескольких текстовых полей. Я узнал, что это работает для меня после множества различных решений.
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
for (id textField in self.view.subviews) {
if ([textField isKindOfClass:[UITextField class]] && [textField isFirstResponder] && [textField isEqual:_selectedLabel] ) {
[textField resignFirstResponder];
}
}
}
Ответ 13
Вы можете использовать endEditing
вместо resignFirstResponder
Попробуйте это
[self.view EndEditing:YES]