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

时间:2009-04-25 06:10:24

标签: ios objective-c xcode cocoa-touch

有没有办法以编程方式启用或禁用UIKeyboard上的返回键?我能找到的最接近的是enablesReturnKeyAutomatically,但这只会告诉我是否要禁用它。

8 个答案:

答案 0 :(得分:72)

可能会关注代码段帮助。

textfield.enablesReturnKeyAutomatically = YES;

这在UITextInputTraits的iPhone SDK中公开可用。使用此选项时,如果文本字段中没有可用的输入文本,则将禁用返回键

答案 1 :(得分:25)

可以在Interface Builder中设置

UITextField的{​​{1}}属性,只需选择文本字段并打开“属性”检查器。正如Tharindu所说,这将根据是否输入任何文本自动启用和禁用返回键。

enter image description here

当然,如果您需要在代码中更改此设置,您仍然可以使用enablesReturnKeyAutomatically以编程方式设置它。

编辑以解决这些问题:

否则,没有正式的方法来启用和禁用命令返回键。我建议不要尝试使用私有API来实现这一目标。或者,您可以使用textFieldShouldReturn:委托方法并将条件/验证放在那里并做出相应的响应。

答案 2 :(得分:23)

如果您可以获得UIKeyboard对象本身(SDK中未公开的内容,请注意,如果您使用这些调用,Apple可能会不高兴),那么就有一个方便的setReturnKeyEnabled:成员函数。

id keyboard = [self magicallyGetAUIKeyboardInstance];
[keyboard setReturnKeyEnabled: NO];

(通过2.2 iPhone框架的Erica Sadun's dump

magicallyGetAUIKeyboardInstance的实施描述为here

答案 3 :(得分:16)

您可以覆盖UITextField的{​​{1}}属性来实现此目标:

hasText

class CustomTextField : UITextField { override public var hasText: Bool { get { return evaluateString(text) } } } 检查您所需的输入条件,例如字符数。

当然,这只能与evaluateString(_ text: String?) -> Bool上设置的enablesReturnKeyAutomatically = true结合使用。

我知道我的回答既不及时,也不是用Objective-C编写的,但鉴于我无法在其他任何地方找到答案而这个问题在其他主题中经常提到,我认为这是发布它的最佳位置。

答案 4 :(得分:3)

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

<强> 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

答案 5 :(得分:0)

这是一种可以从记录的API中获得的技术,但是当禁用回车键时它不提供视觉反馈。

- (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];

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

答案 6 :(得分:0)

尝试使用UITextField!接收此字符串,然后返回就消失了!

答案 7 :(得分:0)

我对duplicate question的回答,复制过来

所有其他解决方案均未回答问题。 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")
}