Ответ 1
Вы пробовали:
[viewReceivingKeys resignFirstResponder];
где viewReceivingKeys
- это UIView, который получает ввод текста?
Я пытаюсь воссоздать что-то похожее на всплывающее меню, используемое в сафари.
Я могу визуально воспроизвести его, разместив панель инструментов над своим представлением и соответствующие кнопки, однако я не могу понять, как закрыть клавиатуру после того, как пользователь коснулся сделанной кнопки.
Вы пробовали:
[viewReceivingKeys resignFirstResponder];
где viewReceivingKeys
- это UIView, который получает ввод текста?
Есть несколько вещей, которые вам нужно запомнить. Разработчики части № 1 забывают установить делегат текстового поля.
Если вы используете построитель интерфейсов, вы должны помнить, что вам нужно установить делегат текстового поля в файл Owner.
Если вы не используете Interface Builder, убедитесь, что вы задали делегат текстового поля. Я также включаю returnType. Например, если textField был вызван gameField:
gameField.delegate = self;
gameField.returnKeyType = UIReturnKeyDone;
Вы также должны реализовать UITextFieldDelegate для своего ViewController.
@interface YourViewController : UIViewController <UITextFieldDelegate>
Наконец, вам нужно использовать метод textFieldShouldReturn и вызвать [textField resignFirstResponder]
-(BOOL) textFieldShouldReturn:(UITextField*) textField {
[textField resignFirstResponder];
return YES;
}
Все ваши текстовые поля будут использовать этот же метод, поэтому вам нужно будет только один раз установить эту настройку. Пока делегат установлен для текстового поля, UITextFieldDelegate реализуется для интерфейса, вы добавляете метод textFieldShouldReturn и вызываете resignFirstResponder ваш набор.
Если вы построили свои собственные представления в Interface Builder, установите для своего контроллера представления делегат для текстового поля и реализуйте textFieldShouldReturn: из UITextFieldDelegate в вашем контроллере представлений.
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField
{
NSLog(@"%@ textFieldShouldReturn", [self class]);
[theTextField resignFirstResponder];
// do stuff with the text
NSLog(@"text = %@", [theTextField text]);
return YES;
}
UITextFieldDelegate textFieldShouldReturn: в документах iphone cocoa
Если вы говорите об отключении клавиатуры от 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
youd, чтобы принять штрихи, а затем инструктируйте текстовое представление уйти в отставку, когда пользователь выходит за пределы самого представления.
Создайте новый класс,
#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 и измените тип представления в файле nib как ваш CustomView
, а не по умолчанию UIView
. Затем в Инспекторе соединений перетащите выход textView
в UITextView
. После этого, и как только вы перестроете свое приложение, коснется вне активного элемента пользовательского интерфейса, теперь будет отключена клавиатура. Обратите внимание, что если UIView
вы подклассифицируете "позади" другие элементы пользовательского интерфейса, эти элементы будут перехватывать касания до того, как они достигнут уровня UIView. Таким образом, хотя это решение является элегантным, оно может использоваться только в некоторых ситуациях. Во многих случаях вам нужно прибегнуть к методу грубой силы добавления кнопки "Готово" на панель навигации, чтобы закрыть клавиатуру.
использовать навигационный контроллер и вызывать просмотр, когда это делается?
например, я использую такой код, чтобы скрыть поле about:
[[self navigationController] presentModalViewController:modalViewController animated:YES];
а затем, когда нажата кнопка в этом поле, я использую это, чтобы избавиться от нее:
[self.navigationController dismissModalViewControllerAnimated:YES];
В моем случае поле about занимает весь экран, но я не думаю, что это должно было бы работать для этого.
edit: Я думаю, что, возможно, неправильно понял ваш вопрос. Что-то в строках моего кода было бы, если вы притворяетесь, что вся клавиатура видна сама. Я думаю, что отставка первого ответчика - это правильный способ сделать это, если это обычная клавиатура с вашей панелью инструментов, добавленной сверху.