Я предполагаю, что вы говорите о UITextField
, а не UITextView
, поскольку ваш вопрос не так ясен?Если это так, убедитесь, что ваш класс помечен как UITextFieldDelegate
в файле интерфейса,
@interface MyController: UIViewController <UITextFieldDelegate> {
UITextField *activeTextField;
// ...remainder of code not show ...
}
, а затем вам следует реализовать два метода делегата, как показано ниже:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
activeTextField = textField;!
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
activeTextField = nil;
[textField resignFirstResponder];
return YES;
}
Однако есливы используете UITextView
тогда все немного сложнее.Протокол UITextViewDelegate
не имеет эквивалента методу textFieldShouldReturn:
, предположительно, поскольку мы не должны ожидать, что клавиша Return будет сигналом того, что пользователь хочет прекратить редактирование текста в многострочном диалоговом окне ввода текста (в конце концов,пользователь может захотеть вставить разрывы строк, нажав клавишу Return).
Однако существует несколько способов, с помощью которых UITextView
может отказаться от должности первого респондента с помощью клавиатуры.Обычный метод - поместить кнопку Готово на панель навигации, когда на UITextView
отображается всплывающая клавиатура.При нажатии эта кнопка просит текстовое представление подать в качестве первого респондента, который затем отклонит клавиатуру.
Однако, в зависимости от того, как вы спланировали свой интерфейс, вы можете захотеть, чтобы UITextView
ушел в отставку.когда пользователь нажимает за пределы UITextView
.Чтобы сделать это, вы должны создать подкласс UIView
для принятия касаний, а затем дать указание текстовому представлению уйти в отставку, когда пользователь нажимает за пределы самого представления.
Создайте новый класс,
#import <UIKit/UIKit.h>
@interface CustomView : UIView {
IBOutlet UITextView *textView;
}
@end
Затем в реализации реализуйте метод touchesEnded:withEvent:
и попросите UITextView
подать в отставку в качестве первого респондента.
#import "CustomView.h"
@implementation CustomView
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// Initialization code
}
return self;
}
- (void) awakeFromNib {
self.multipleTouchEnabled = YES;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"touches began count %d, %@", [touches count], touches);
[textView resignFirstResponder];
[self.nextResponder touchesEnded:touches withEvent:event];
}
@end
После того, как вы добавили класс, вам нужно сохранить все ваши изменения, затем перейти в Interface Builder и щелкнуть на своем представлении.Откройте инспектор удостоверений в Utility pabel и измените тип представления в файле nib на ваш CustomView
, а не на класс UIView
по умолчанию.Затем в инспекторе соединений перетащите выход textView
в UITextView
.После этого и после перестройки приложения прикосновения к активным элементам пользовательского интерфейса теперь будут отклонять клавиатуру.Однако обратите внимание, что если UIView
, который вы создаете, является «позади» других элементов пользовательского интерфейса, эти элементы будут перехватывать касания, прежде чем они достигнут уровня UIView.Таким образом, хотя это решение элегантно, оно может использоваться только в некоторых ситуациях.Во многих случаях вам придется прибегнуть к методу грубой силы, добавив кнопку Готово к панели навигации, чтобы закрыть клавиатуру.