it-swarm.com.ru

Как вы распускаете клавиатуру при редактировании UITextField

Я знаю, что должен сказать своему UITextField об отставке первого респондента, когда я хочу закрыть клавиатуру, но я не уверен, как узнать, когда пользователь нажал клавишу "Готово" на клавиатуре. Могу ли я посмотреть уведомление?

177
kubi

Я назначил делегата UITextField в свой класс ViewController.

В этом классе я реализовал этот метод следующим образом:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}
346
kubi

Если вы подключите событие DidEndOnExit текстового поля к действию (IBAction) в InterfaceBuilder, оно будет передано, когда пользователь отклонит клавиатуру (с клавишей возврата), и отправитель будет ссылаться на UITextField, который вызвал событие.

Например:

-(IBAction)userDoneEnteringText:(id)sender
{
    UITextField theField = (UITextField*)sender;
    // do whatever you want with this text field
}

Затем в InterfaceBuilder свяжите событие DidEndOnExit текстового поля с этим действием на вашем контроллере (или всем, что вы используете для связи событий из пользовательского интерфейса). Всякий раз, когда пользователь вводит текст и отклоняет текстовое поле, контроллеру будет отправлено это сообщение.

47
Jason Coco

Вы также можете создать метод в вашем контроллере

 -(IBAction)editingEnded:(id)sender{
    [sender resignFirstResponder]; 
}

а затем в инспекторе подключений в IB подключите к нему событие "Did End On Exit".

31
Hugo

куби, спасибо. Ваш код сработал. Просто чтобы быть явным (как для новичков), как вы говорите, вы должны установить UITextFieldname delegateравным ViewController, в котором находится текстовое поле. Вы можете сделать это где угодно. Я выбрал метод viewDidLoadname__.

- (void)viewDidLoad 
{
    // sets the textField delegates to equal this viewController ... this allows for the keyboard to disappear after pressing done
    daTextField.delegate = self;
}
19
alexander White

Вот трюк для получения автоматического поведения при отключении клавиатуры без кода вообще. В наконечнике отредактируйте прокси-объект "Первый ответчик" в инспекторе удостоверений, добавив новое действие "Первый ответчик"; давайте назовем это dummy:. Теперь подключите событие Did End on Exit текстового поля к действию dummy: прокси-объекта "Первый ответчик". Это оно! Поскольку у события "Завершить при выходе" в текстовом поле теперь есть пара "действие - цель", текстовое поле автоматически отклоняет свою клавиатуру, когда пользователь нажимает "Возврат"; и поскольку нет штрафов за то, что не удалось найти обработчик для сообщения, отправленного по цепочке респондента, приложение не аварийно завершает работу, даже если нигде не реализовано dummy:.

18
matt

Просто добавь

[textField endEditing:YES];

где вы хотите отключить клавиатуру и отобразить вид выбора.

11
user415897

В Swift вы можете написать IBAction в контроллере и установить для этого события Did End On Exit текстового поля.

@IBAction func returnPressed(sender: UITextField) {
    self.view.endEditing(true)
}
9
Safin Ahmed

Вы также можете использовать

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
  {

   [self.yourTextField resignFirstResponder];

  }

Лучше всего, если у вас много полей Uitextfields:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {    
     [self.view endEditing:YES];
 }
4
Metalhead1247

Вот что я должен был сделать, чтобы заставить его работать, и я думаю, что это необходимо для любого, у кого есть цифровая клавиатура для клавиатуры (или любой другой без кнопки готово):

  1. Я изменил UIView в ViewController на UIControl.
  2. Я создал функцию под названием

    -(IBAction)backgroundIsTapped:(id)sender
    

Это также было определено в файле .h.

После этого я связался с битом "приземления" для ViewController в Интерфейсном Разработчике.

В функции 'background is tapped' я поставил это:

    [answerField resignFirstResponder];

Просто не забудьте заменить answerField на имя UITextField, с которого вы хотите удалить клавиатуру (очевидно, убедитесь, что ваш UITextField определен, как показано ниже :)

    IBOutlet UITextField * <nameoftextfieldhere>;

Я знаю, что эта тема, вероятно, умерла давным-давно ... но я надеюсь, что это поможет кому-то, где-то!

2
Ryan Bourne

Вы заметите, что метод textFieldShouldReturn предоставляет объект текстового поля, который нажал клавишу DONE. Если вы установите TAG, вы можете включить это текстовое поле. Или вы можете отслеживать и сравнивать указатель объекта с некоторым значением члена, сохраненным его создателем.

Мой подход такой для самостоятельной работы:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    bool fDidResign = [textField resignFirstResponder];

    NSLog(@"%s: did %resign the keyboard", __FUNCTION__, fDidResign ? @"" : @"not ");

    return fDidResign;
}

Между тем я поставил "проверку", которая отрицает отставку. Это только для иллюстрации, поэтому, если пользователь печатает НЕТ! в поле, это не уволят. Поведение было таким, как я хотел, но последовательность вывода была не такой, как я ожидал.

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    NSLog(@"%s", __FUNCTION__);

    if( [[textField text] isEqualToString:@"NO!"] ) {
        NSLog(@"%@", textField.text);
        return NO;
    } else {
        return YES;
    }
}

Следующее - мой вывод NSLog для этого отказа, сопровождаемого принятием. Вы заметите, что я возвращаю результат отставки, но я ожидал, что он вернет мне ЛОЖЬ, чтобы сообщить об этом вызывающей стороне ?! Помимо этого, он имеет необходимое поведение.

 13.313 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 
 13.320 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldEndEditing:] 
 13.327 StudyKbd 109:! 
 13.333 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:]: отключил клавиатуру 
 59.891 StudyKbd [109: 207] - [StudyKbdViewController textFieldShouldReturn:] 
 59.897 Study : 207] - [StudyKbdViewController textFieldShouldEndEditing:] [.__ клавиатура 
2
mobibob

если вы хотите все редактирование в UIViewController вы можете использовать.

[[self view]endEditing:YES];

и если вы хотите закрыть скрытую скрытую клавиатуру UITextField, используйте.

1. добавить делегата в ваш viewcontroller.h

<UITextFieldDelegate>
  1. сделать делегирование невозможным для вашего текстового поля.

    self.yourTextField.delegate = self;

  2. добавьте этот метод в ваш viewcontroller.

    - (BOOL) textFieldShouldEndEditing: (UITextField *) textField {[textField resignFirstResponder]; вернуть ДА;}

1
Abhimanyu Rathore

Программно установите делегат UITextField в Swift 3

реализовать UITextFieldDelegate в файле ViewController.Swift (например, класс ViewController: UIViewController, UITextFieldDelegate {)

 lazy var firstNameTF: UITextField = {

    let firstname = UITextField()
    firstname.placeholder = "FirstName"
    firstname.frame = CGRect(x:38, y: 100, width: 244, height: 30)
    firstname.textAlignment = .center
    firstname.borderStyle = UITextBorderStyle.roundedRect
    firstname.keyboardType = UIKeyboardType.default
    firstname.delegate = self
    return firstname
}()

lazy var lastNameTF: UITextField = {

    let lastname = UITextField()
    lastname.placeholder = "LastName"
    lastname.frame = CGRect(x:38, y: 150, width: 244, height: 30)
    lastname.textAlignment = .center
    lastname.borderStyle = UITextBorderStyle.roundedRect
    lastname.keyboardType = UIKeyboardType.default
    lastname.delegate = self
    return lastname
}()

lazy var emailIdTF: UITextField = {

    let emailid = UITextField()
    emailid.placeholder = "EmailId"
    emailid.frame = CGRect(x:38, y: 200, width: 244, height: 30)
    emailid.textAlignment = .center
    emailid.borderStyle = UITextBorderStyle.roundedRect
    emailid.keyboardType = UIKeyboardType.default
    emailid.delegate = self
    return emailid
}()

// Mark: - обработка делегата textField ..

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    view.endEditing(true)
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    if textField == firstNameTF {

        lastNameTF.becomeFirstResponder()
    }

    else if textField == lastNameTF {

        emailIdTF.becomeFirstResponder()
    }
    else {
        view.emailIdTF(true)
    }
    return true
}
1
Tanjima

Вот довольно чистый способ завершить издание ключом возврата или касанием на заднем плане.

В Интерфейсном Разработчике вставьте свои поля в представление класса UIFormView

Что делает этот класс:

  • Автоматически присоединять себя как делегат полей (либо разбудить от пера, либо добавить вручную)
  • Сохранить ссылку на текущее редактируемое поле
  • Отключить клавиатуру при возврате или коснуться в фоновом режиме

Вот код:

Интерфейс

#import <UIKit/UIKit.h>

@interface UIFormView : UIView<UITextFieldDelegate>

-(BOOL)textFieldValueIsValid:(UITextField*)textField;
-(void)endEdit;

@end

Реализация

#import "UIFormView.h"

@implementation UIFormView
{
    UITextField* currentEditingTextField;
}

// Automatically register fields

-(void)addSubview:(UIView *)view
{
    [super addSubview:view];
    if ([view isKindOfClass:[UITextField class]]) {
        if ( ![(UITextField*)view delegate] ) [(UITextField*)view setDelegate:self];
    }
}

// UITextField Protocol

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    currentEditingTextField = textField;
}

-(void)textFieldDidEndEditing:(UITextField *)textField
{
    currentEditingTextField = NULL;
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self endEdit];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    if ([self textFieldValueIsValid:textField]) {
        [self endEdit];
        return YES;
    } else {
        return NO;
    }
}

// Own functions

-(void)endEdit
{
    if (currentEditingTextField) {
        [currentEditingTextField endEditing:YES];
        currentEditingTextField = NULL;
    }
}


// Override this in your subclass to handle eventual values that may prevent validation.

-(BOOL)textFieldValueIsValid:(UITextField*)textField
{
    return YES;
}

@end
  • Подклассифицируя форму и переопределяя метод textFieldValueIsValid:, вы можете избежать окончания редактирования, если значение не является правильным для данного поля.

  • Если у поля есть делегат, установленный в Интерфейсном Разработчике, то форма не изменяет его. Я не вижу много причин, чтобы назначить другого делегата для определенного поля, но почему бы и нет ...

Есть много способов улучшить этот класс представления формы - присоединить делегат, сделать некоторую разметку, обработать, когда клавиатура покрывает поле (используя фрейм currentEditingTextField), автоматически запустить редактирование для следующего поля, ...

Я лично держу его в своей структуре и всегда делю на подклассы, чтобы добавить функции, это довольно часто полезно "как есть".

Я надеюсь, что это поможет. Ура все

1
Moose
//====================================================
//                  textFieldShouldReturn:
//====================================================
-(BOOL) textFieldShouldReturn:(UITextField*) textField { 
    [textField resignFirstResponder];
    if(textField.returnKeyType != UIReturnKeyDone){
        [[textField.superview viewWithTag: self.nextTextField] becomeFirstResponder];
    }
    return YES;
}
0
jake

попробуй это

- (BOOL) textView: (UITextView*) textView shouldChangeTextInRange: (NSRange) range replacementText: (NSString*) text
{
    if ([text isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}
0
Vineesh TP

Вот как я отклоняю клавиатуру в Swift 4.2, и она работает для меня:

    override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: 
    #selector(dismissKeyboard))

    view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
    numberField.resignFirstResponder()
    }
0
Prakhar Prakash Bhardwaj

Любой, кто ищет Swift

1) Убедитесь, что ваш ITextField's Delegate подключен к вашему ViewController в раскадровке

2) Реализация ITextFieldDelegate в вашем файле ViewController.Swift (например, класс ViewController: UIViewController, UITextFieldDelegate {)

3) Используйте метод делегата ниже

func textFieldShouldReturn(textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
return false }
0
Burf2000

Если вы создали представление с помощью Interface Builder, используйте следующее. Просто создайте метод,

-(IBAction)dismissKeyboard:(id)sender
{
[sender resignFirstResponder];
}

Просто щелкните правой кнопкой мыши текстовое поле в представлении и установите событие как "Завершить при выходе", и подключите его к методу "dismissKeyboard".

Лучшее руководство для начинающих - "Head First iPhone и iPad Development, 2nd Edition"

0
chandru

Создайте функцию hidekeyboard и свяжите ее с текстовым полем в файле .xib и выберите DidEndOnExit

-(IBAction)Hidekeyboard    
{    
      textfield_name.resignFirstResponder;    
}  
0
pooja_chaudhary