Если вы говорите об отклонении клавиатуры от 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. Таким образом, хотя это решение элегантно, оно может использоваться только в некоторых ситуациях. Во многих случаях вам придется прибегнуть к методу грубой силы, добавив кнопку Готово к панели навигации, чтобы закрыть клавиатуру.