Для меня причина в том, что я одновременно открыл один и тот же файл в обоих редакторах Primary Editor и Assistant Editor . Как только я закрыл помощника редактора, он прошел. (Версия Xcode 7.2.1)
Используйте resignFirstResponder в touchesBegan, например так:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
[self.myTextField resignFirstResponder];
}
}
Вам может потребоваться вызвать это в нескольких текстовых полях, если вы не уверены, где в данный момент находится фокус; Я не проверял этот случай.
Кроме того, в Интерфейсном Разработчике вам необходимо включить флажок «Взаимодействие с пользователем включено» для представления или использовать программно:
myView.userInteractionEnabled = YES;
Просто вызовите это в вашем контроллере представления, когда вы хотите скрыть клавиатуру.
[self.view endEditing:NO];
Я использую
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
if(touch.phase==UITouchPhaseBegan){
//find first response view
for (UIView *view in [self.view subviews]) {
if ([view isFirstResponder]) {
[view resignFirstResponder];
break;
}
}
}
}
это работает для меня
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:NO];
}
нужно только в self.view иметь UItextField
http://objdev.com/2013/11/Dismissing-iOS- Клавиатура-Self-View-EndEditing
Спасибо, Бленк, я пытался понять, как это сделать, и не осознавал, что могу поставить кнопку на заднем плане, хороший трюк! Вот мой вклад (новичок в этом сайте и в Cocoa Touch, так что он, возможно, не самый надежный код когда-либо, но он пока работает ...):
Я вызываю этот метод из события touchUpInside
в my UIButton:
-(void)closeKeyboard:(id)sender {
UIView *theFirstResponder = [self findFirstResponder];
if (theFirstResponder) {
[theFirstResponder resignFirstResponder];
}
}
Где этот цикл находит firstResponder:
- (UIView *)findFirstResponder {
UIView *firstResponderView = nil;
for (UIView *view in [self entryFields]) {
if ([view isFirstResponder]) {
firstResponderView = view;
break;
}
}
return firstResponderView;
}
Он зависит от каждого элемента управления UITextField
в представлении, имеющего тег назначенный им (опять же, это можно сделать в Интерфейсном Разработчике).
Мои два цента в любом случае, хотя я бы лучше что-нибудь вернуть!
Супер простой способ сделать это работает на том, что сказал PCheese.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
[self.view endEditing:YES];
}
}
Я ранее использовал [self.view endEditing:YES];
для события кнопки, но в сочетании с предыдущим ответом это работает угощение. Намного проще, и вам больше ничего не нужно делать - просто поместите это в свой файл .m. Кроме того, это работает со всеми (по крайней мере, насколько я видел) текстовыми полями (работает для UITextField и UITextView).
Я знаю, что OP, вероятно, все еще не будет нуждаться в этом, но я просто хочу поделиться им с теми же проблемами.
Согласно Начиная разработку iPhone , вы рисуете круглую прямоугольную кнопку, чтобы она покрывала весь ваш пользовательский интерфейс; полный экран. Затем перейдите в меню Layout и нажмите Send to Back . Затем в инспекторе измените тип кнопки с круглого прямоугольника на Пользовательский . Теперь добавьте к этой кнопке событие подкраски и прикрепите его к методу, который его обрабатывает. В теле этого метода убедитесь, что у вас есть операторы:
[myTextFieldOne resignFirstResponder];
[myTextFieldTwo resignFirstResponder];
По сути, отправьте сообщение resignFirstResponder
каждому из ваших текстовых полей или любому полю, которое может создать клавиатуру.
Я действительно новичок в iPhone SDK. Я не знаю, является ли это лучшим методом, но он работает, и это то, что я узнал из вышеупомянутой книги. Надеюсь, это поможет.
Для быстрой версии 4.0
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = touches.first
if touch?.phase == UITouchPhase.began {
touch?.view?.endEditing(true)
}
}
Измените класс UIView на класс UIControl на вкладке идентификации инспектора. Добавьте это:
- (IBAction)tabBackground:(id) sender;
в ваш файл .h.
Добавьте это в свой файл .m:
- (IBAction)tabBackgroup:(id) sender {
[nameField resignFirstRespnder];
[numberField resignFirstResponder];
}
Подключите ваш tabBackground из инспектора, раздел «Полученные действия» к UIView (который является UIControl), и все готово. ]
Наиболее подходящим способом решения этой проблемы является использование следующего метода:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if(![touch.view isMemberOfClass:[UITextField class]]) {
[touch.view endEditing:YES];
}
}
Примечание: это не работает на экземплярах UIScrollView.
Так что я мучился по этому поводу, и я понял это.
Вам не нужна другая кнопка или что-то еще.
Все, что вам нужно сделать, это выбрать «Владелец файлов», в инспекторе перетащить из его выхода textField (или как вы его назвали) в ваше фактическое текстовое поле (через то, что вы назвали его) Это будет в дополнение к все, что вы уже подключили.
и, конечно же, в дополнение к выходу Control (UIview изменен на UIControl через инспектора) для владельца файлов через backgroundtouched ... первое, что мы все попробовали