Подтвердить что ты не робот

Как изменить returnKeyType во время редактирования?

Как изменить ключ возврата на iPhone во время его редактирования. Я знаю о

myTextField.returnKeyType = UIReturnKeySearch;

Однако это работает только в том случае, если я вызываю [myTextField resignFirstResponder];, а затем [myTextField becomeFirstResponder];, который скрывает клавиатуру и возвращает ее обратно. В противном случае, это просто остается тем, что я имел раньше, в этом случае это было "Go". Мне нужно продолжать переключать их в зависимости от символов, которые вводит пользователь.


В одной строке: Как изменить тип клавиши возврата на клавиатуре во время ее редактирования?

4b9b3361

Ответ 1

[textField reloadInputViews] кажется, делает трюк...

Ответ 2

Я нашел это некоторое время назад, забыл написать здесь. Я использую:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange: 
(NSRange)range replacementString:(NSString *)string {
    [self performSelector:@selector(addressBarTextDidChange:) withObject:nil afterDelay:0.1];
    return YES;
}

-(void)addressBarTextDidChange:(NSString *)text {
    NSString *addressText = @"..."; //Wherever you get your text from... 
    if ([addressText isEqualToString:@""]==NO) {
        if ([addressText rangeOfString:@" "].location != NSNotFound) {
            //[addressBarTextField setReturnKeyType:UIReturnKeySearch];
            if (addressBarTextField.returnKeyType!=UIReturnKeySearch) {
                [UIView beginAnimations:nil context:NULL]; //Setup the animation.
                [UIView setAnimationDuration:0.0]; //The duration for the animation.
                [addressBarTextField resignFirstResponder];
                addressBarTextField.returnKeyType = UIReturnKeySearch;
                [addressBarTextField becomeFirstResponder];
                [UIView commitAnimations];
            }
        } else {
            //[addressBarTextField setReturnKeyType:UIReturnKeyGo];
            if (addressBarTextField.returnKeyType!=UIReturnKeyGo) {
                [UIView beginAnimations:nil context:NULL]; //Setup the animation.
                [UIView setAnimationDuration:0.0]; //The duration for the animation.
                [addressBarTextField resignFirstResponder];
                addressBarTextField.returnKeyType = UIReturnKeyGo;
                [addressBarTextField becomeFirstResponder];
                [UIView commitAnimations];
            }
        }

    } else {
        if (addressBarTextField.returnKeyType!=UIReturnKeyDone) {
            [UIView beginAnimations:nil context:NULL]; //Setup the animation.
            [UIView setAnimationDuration:0.0]; //The duration for the animation.
            [addressBarTextField resignFirstResponder];
            addressBarTextField.returnKeyType = UIReturnKeyDone;
            [addressBarTextField becomeFirstResponder];
            [UIView commitAnimations];
        }
    }
}

В принципе, я оживляю клавиатуру в течение и в течение 0,0 секунд (так что пользователь ее не увидит). Я также проверяю, не является ли клавиатура еще той, которую я хочу, перед переключением, потому что постоянное переключение вызывает задержку.

Ответ 3

В моем случае он работал следующим образом:

sender.returnKeyType=UIReturnKeyNext;
[sender reloadInputViews];
[sender resignFirstResponder];
[sender becomeFirstResponder];

Мне пришлось форсировать risignFirstResponder, за которым следует startFirstponder.

Ответ 4

Я создал пользовательскую категорию, чтобы открыть returnKeyType. Просто импортируйте и делайте self.addField.returnKeyType = UIReturnKeySearch; или все, что вы хотите установить как returnKeyType. Вы также можете использовать его динамически, когда клавиатура уже открыта. Он будет автоматически обновляться.

Вот он:

Интерфейс:

/*

 Simple hack for exposing returnKeyType for UISearchBar without private APIs
 For you from CodeBuffet ;)


 Enjoy!

 ~PW

*/

#import <UIKit/UIKit.h>

@interface UISearchBar (ReturnType)

@property (nonatomic, readwrite) UIReturnKeyType returnKeyType;

@end

Реализация:

#import "UISearchBar+ReturnType.h"

@implementation UISearchBar (ReturnType)

UITextField *textField;

- (UITextField *) traverseForTextViewInViews: (NSArray*) views
{
    // Traverse over all views recursively until we find the tresure TextField hidden deep the UISearchBar ocean!
    for(UIView *subView in views) {
        if([subView conformsToProtocol:@protocol(UITextInputTraits)]) {
            return (UITextField *) subView;
        }
        UITextField *tv = [self traverseForTextViewInViews:subView.subviews];
        if (tv) {
            return tv;
        }
    }
    return nil;
}

#pragma mark Custom Setters & Getters

- (void)setReturnKeyType:(UIReturnKeyType)returnKeyType
{
    if (!textField) {
        textField = [self traverseForTextViewInViews:self.subviews];
    }
    textField.returnKeyType = returnKeyType;
    [self reloadInputViews];
    [textField reloadInputViews];
}

- (UIReturnKeyType)returnKeyType
{
    if (!textField) {
        textField = [self traverseForTextViewInViews:self.subviews];
    }
    return textField.returnKeyType;
}

@end

Ответ 5

Мне нужно было обновить returnKeyType (Next ↔ Go) на основе текущего содержимого текстового поля. Метод reloadInputViews в текстовом поле не работал после установки метода returnKeyType. Как отмечали другие плакаты, необходим resignFirstResponder, за которым следует startFirstponder. В моей ситуации, когда текстовое поле стало первымResponder и отобразило клавиатуру, оно оживило бы увольнение и повторное появление клавиатуры. На более мелких устройствах или в ландшафтном режиме это также приведет к мгновенному скачку представления, содержащего текстовое поле. Решение, которое я нашел, чтобы скрыть это нежелательное поведение, заключается в том, чтобы поместить resignFirstResponder и статьFirstResponder в блок анимации продолжительностью 0 секунд.

            [UIView animateWithDuration:0.0
                                  delay:0.0
                                options:0
                             animations:^{
                                 [textField reloadInputViews];
                                 [textField resignFirstResponder];
                                 [textField becomeFirstResponder];
                             }
                             completion:nil];

Ответ 6

Вы пытались использовать делегат TextField:

- (BOOL) textFieldShouldBeginEditing: (UITextField *) textField {    textField.returnKeyType = UIReturnKeySearch;    return YES; }

Ответ 7

Я сделал это с этими тремя строками кода:

[sender setReturnKeyType:UIReturnKeyDone];
[sender resignFirstResponder];
[sender becomeFirstResponder];

Ответ 8

Swift 3

После изменения returnKeyType вашего вызова UITextField или UITextView:

textFieldOrView.resignFirstResponder()
textFieldOrView.becomeFirstResponder()

Хотя вызов textFieldOrView.reloadInputViews() работает в некоторых случаях, он не так безопасен, как решение выше.