如何禁用/启用UITextField中的返回键?


Answers:


86

以下代码段可能会有所帮助:

textfield.enablesReturnKeyAutomatically = YES;

这可以在iPhone SDK的UITextInputTraits中公开获得。使用此选项,当文本字段中没有输入文本可用时,返回键将被禁用。


2
在Swift中:textfield.enablesReturnKeyAutomatically = true
AmyNguyen

3
听起来可能很傻,但是当我来到这里时我想要这个答案。就像我认为很多人一样,我盲目地点击了Google出现的第一个链接,完全跳过了问题,然后阅读了前几个答案
Joe Pinsonault

28

UITextFieldenablesReturnKeyAutomatically可以在Interface Builder中直接设置的属性,只需选择文本字段并打开“属性”检查器。如Tharindu所述,这将根据是否输入任何文本自动启用和禁用返回键。

在此处输入图片说明

当然,如果您需要在代码中更改此设置,仍然可以使用编程设置nameTextField.enablesReturnKeyAutomatically = true

编辑以解决下降投票:

否则,没有正式的方法来启用和禁用命令上的返回键。我建议不要尝试使用私有API来完成此任务。另外,您可以使用textFieldShouldReturn:委托方法,并将条件/验证放在那里,并做出相应的响应。


27

您可以覆盖UITextFieldhasText属性以实现此目的:

class CustomTextField : UITextField {
    override public var hasText: Bool {
        get {
            return evaluateString(text)
        }
    }
}

在这里evaluateString(_ text: String?) -> Bool检查所需的输入条件,例如字符数。

当然,这只能与enablesReturnKeyAutomatically = true上的设置结合使用UITextField

我知道我的答案既不及时也不用Objective-C编写,但是鉴于我无法在其他任何地方找到答案,并且这个问题在其他线程中经常提及,因此我认为这是最好的解决方法发表它。


这可行,但是会导致密码KeyboardAccessory永不消失。
Sethmr

1

一个好主意是创建一个文件以从任何地方访问此类。这是代码:

UIKeyboard.h

#import <UIKit/UIKit.h> 

@interface UIApplication (KeyboardView)

    - (UIView *)keyboardView; 

@end

UIKeyboard.m

#import "UIKeyboard.h"

@implementation UIApplication (KeyboardView)

- (UIView *)keyboardView
{
    NSArray *windows = [self windows];
    for (UIWindow *window in [windows reverseObjectEnumerator])
    {
        for (UIView *view in [window subviews])
        {
            if (!strcmp(object_getClassName(view), "UIKeyboard"))
            {
                return view;
            }
        }
    }

    return nil;
}

@end

现在,您可以从自己的班级导入和访问该班级:

#import "UIKeyboard.h"

    // Keyboard Instance Pointer.
    UIView *keyboardView = [[UIApplication sharedApplication] keyboardView];

您可以在以下位置找到此类的完整文档: http : //ericasadun.com/iPhoneDocs/_u_i_keyboard_8h-source.html

您可以在这里找到更多信息: http : //cocoawithlove.com/2009/04/showing-message-over-iphone-keyboard.html


12
应用商店拒绝率:100%

我认为这不值得拒绝。我们只迭代子视图并选择我们喜欢的子视图。但是,它很方便,无法回答有关禁用返回键的问题。
鲁沙卜(Roshabh)'18 -4-9

1
这只是一个非常糟糕的主意……除了Apple拒绝您之外,系统设置可能会在您不知道并无法解决此问题的情况下发生更改。
佐拉尔

0

我对重复问题的回答,复制过来

所有其他解决方案都不能回答问题。OP希望“灰显”键盘上的返回按钮,作为对用户的视觉信号。

这是我在iOS 13上运行的解决方案。对于其他iOS版本,您可能需要稍作修改。

首先,我扩展UITextFieldDelegate

func getKeyboard() -> UIView?
    {
        for window in UIApplication.shared.windows.reversed()
        {
            if window.debugDescription.contains("UIRemoteKeyboardWindow") {
                if let inputView = window.subviews
                    .first? // UIInputSetContainerView
                    .subviews
                    .first // UIInputSetHostView
                {
                    for view in inputView.subviews {
                        if view.debugDescription.contains("_UIKBCompatInputView"), let keyboard = view.subviews.first, keyboard.debugDescription.contains( "UIKeyboardAutomatic") {
                            return keyboard
                        }
                    }
                }
                
            }
        }
        return nil
    }

然后,每当我需要禁用“返回”键时,我们都可以做(用delegate您的委托对象的变量名代替):

if let keyboard = delegate.getKeyboard(){
    keyboard.setValue(text == nil, forKey: "returnKeyEnabled")
}

-1

这是一种已记录的API可用的技术,但是在禁用Enter键时它不提供视觉反馈。

- (void)setup {
    // Or in init
    self.textField.delegate = self;
}

// <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    // substitute your test here
    return [textField.text rangeOfString:@"@"].location != NSNotFound;
}

这里的其他答案可以与

[textField addTarget:self
              action:@selector(validateTextField:)
    forControlEvents:UIControlEventEditingChanged];

在用户输入时提供动态的视觉反馈。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.