Отключить клавиатуру iphone - PullRequest
       11

Отключить клавиатуру iphone

15 голосов
/ 23 декабря 2008

Я пытаюсь воссоздать что-то похожее на всплывающую клавиатуру, используемую в сафари.

alt text

Я могу визуально воспроизвести его, поместив панель инструментов над моим видом и соответствующими кнопками, однако я не могу найти какой-либо способ отменить клавиатуру, когда пользователь нажал кнопку «Готово».

Ответы [ 5 ]

50 голосов
/ 26 июля 2009

Есть пара вещей, которые вам нужно запомнить. Разработчики деталей номер 1, которые забывают установить, - это делегат textField.

Если вы используете Interface Builder, вы должны помнить, что вам нужно установить делегат textField для владельца файла.

Если вы не используете Interface Builder, убедитесь, что для делегата текстового поля установлено значение self. Я также включаю 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;
}

Все ваши textFields будут использовать один и тот же метод, так что вам нужно выполнить эту настройку только один раз. Пока делегат установлен для textField, для интерфейса реализован UITextFieldDelegate, вы добавляете метод textFieldShouldReturn и вызываете resignFirstResponder ваш набор.

26 голосов
/ 23 декабря 2008

Вы пробовали:

[viewReceivingKeys resignFirstResponder];

где viewReceivingKeys - это UIView, который получает ввод текста?

6 голосов
/ 23 декабря 2008

Если вы строите свои собственные представления в Интерфейсном Разработчике, установите контроллер представления для делегирования для текстового поля и внедрите textFieldShouldReturn: from 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 по какао

2 голосов
/ 21 февраля 2012

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

0 голосов
/ 23 декабря 2008

использовать навигационный контроллер и выскочить, когда закончите?

например, я использую такой код, чтобы вставить поле about в:

[[self navigationController] presentModalViewController:modalViewController animated:YES];

и затем, когда нажимается кнопка в этом окне, я использую это, чтобы избавиться от нее:

[self.navigationController dismissModalViewControllerAnimated:YES];

В моем случае окно about занимает весь экран, но я не думаю, что это должно сработать.

редактировать: я думаю, что я, возможно, неправильно понял ваш вопрос. Что-то вроде моего кода было бы, если бы вы сами симулировали весь вид клавиатуры. Я думаю, что отставка первого респондента является правильным способом сделать это, если это обычная клавиатура с добавленной панелью инструментов сверху.

...