Вопрос по uitextfield, objective-c, iphone – Как изменить returnKeyType при редактировании?

29

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

<code>myTextField.returnKeyType = UIReturnKeySearch;
</code>

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

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

Ваш Ответ

8   ответов
0

Swift 3

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

textFieldOrView.resignFirstResponder()
textFieldOrView.becomeFirstResponder()

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

51

[textField reloadInputViews] кажется, делает свое дело ...

У reloadInputViews есть несколько предостережений. Увидетьstackoverflow.com/questions/5958427/…, Он также возвращает клавиатуру в исходное состояние. Поэтому, если пользователь переключился на одну из других раскладок клавиатуры (цифры, знаки препинания и т. Д.), Это состояние будет потеряно.
Это также приведет к отключению сочетаний клавиш на устройстве, т. Е. Если вы вызовете reloadViews во время редактирования пользователем (на основании изменений ввода), всплывающее окно не появится; вместо этого вводится текст, введенный до сих пор. Я бы использовал это только в полях, где ярлыки отключены (например, поля пароля).
Завтра попробую. Спасибо Ali Hamze
Хорошая информация. Вы экономите мое время. Спасибо.
Делает бизнес. Ключ должен делать вещи в правильном порядке, например [myTextField intoFirstResponder]; myTextField.returnKeyType = UIReturnKeyDone; [myTextField reloadInputViews];
6

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

- (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 секунд (поэтому пользователь не увидит ее). Я также проверяю, не является ли клавиатура той, которую я хочу, перед переключением, потому что постоянное переключение вызывает задержку.

это так сработало для меня - спасибо!
2

Я создал пользовательскую категорию для предоставления 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
Новая проблема - и действительно серьезная - поэтому пришлось отказаться от этого. Если вы укажете & quot; NumberPad & quot; и используйте этот трюк, клавиатура "застряла" и не отклонит - по крайней мере, изображение клавиатуры останется. Вздох. Так что переключился обратно на старую «отставка-стать» техника.
К сожалению, после экспериментов я обнаружил, что могу перейти от «По умолчанию к следующему» - это прекрасно работает. Но если пользователь удаляет текст, и я хочу вернуться к значению по умолчанию, он не "берет" - он остается на следующем (по крайней мере на симуляторе). Вздох. Я действительно надеялся, что это будет работать все время ...
Удивительно, но это все еще работает в iOS 9.3. Что вам нужно сделать, так это найти подпредставление, которое соответствует как UITextInputTraits (для установки returnKeyType), так и UIResponder (чтобы вы могли отправлять reloadInputViews). Вам не нужно отправлять reloadInputViews для "self". Кроме того, вы не можете написать все это в Swift - нет способа установить returnKeyType (его необязательное свойство) - по крайней мере, для этого вам нужно использовать Objective C. Самая приятная часть вашего решения - клавиатура не двигается!
1

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

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

В моем случае это работало так:

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

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

Помните, что это имеет недостатки с полем пароля (secureTextEntry). Вызов resignFirstResponder & amp; comeFirstResponder сбрасывает поле так, что следующая запись клавиатуры заменяет предыдущий текст (что походит на стандартное поведение в поле пароля).
0

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

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

Да, но это все еще требует, чтобы я закрыл и открыл клавиатуру. Я получил ответ, так что в любом случае спасибо. Ali Hamze
1

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

[sender setReturnKeyType:UIReturnKeyDone];
[sender resignFirstResponder];
[sender becomeFirstResponder];
Вам нужно разобраться с тем, что клавиатуру закрывают, а потом снова появляются. Не невозможно, но грязно.

Похожие вопросы