Reputation: 143204
Is there a way to programmatically enable or disable the Return Key on the UIKeyboard
? The closest I could find is enablesReturnKeyAutomatically
, but that only will tell whether to disable it at all.
Upvotes: 83
Views: 66481
Reputation: 5135
Let me suggest a bit hacky solution which requires no subclassing.
extension UITextFieldDelegate {
func setReturnKeyState(for textField: UITextField, isEnabled: Bool, delay: Double? = nil) {
textField.enablesReturnKeyAutomatically = false
if textField.delegate != nil {
if let delay = delay {
DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
}
} else {
textField.setValue(isEnabled, forKeyPath: "inputDelegate.returnKeyEnabled")
}
}
}
}
Usage practical sample
Define any condition, for example like this:
private func validateInput(_ string: String?) -> Bool {
(string?.count ?? 0) > 3
}
Call setReturnKeyState
in delegate methods, for example:
func textFieldDidBeginEditing(_ textField: UITextField) {
setReturnKeyState(for: textField, isEnabled: validateInput(textField.text), delay: 0.1) // A bit hacky it needs delay here
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if var text = textField.text, let range = Range(range, in: text) {
text.replaceSubrange(range, with: string)
setReturnKeyState(for: textField, isEnabled: validateInput(text))
}
return true
}
Upvotes: 3
Reputation: 400
My answer to the duplicate question, copied over:
All the other solutions do not answer the question. OP wants to "gray" out the return button on the keyboard as a visual signal to the user.
Here is my solution, working on iOS 13. You may have to modify the solution slightly for other iOS versions.
First, I extend 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
}
Then, whenever I need to disable the "return" key, we can do (replace delegate
with the variable name of your delegate object):
if let keyboard = delegate.getKeyboard(){
keyboard.setValue(text == nil, forKey: "returnKeyEnabled")
}
Upvotes: 0
Reputation: 3361
Maybe the following code segment helps:
textfield.enablesReturnKeyAutomatically = YES;
This is publicly available in iPhone SDK in UITextInputTraits. Using this, return key will be disabled when no input text is available within text field.
Upvotes: 90
Reputation: 20
Try to use a UITextField! to receive this string and than the return are gone!
Upvotes: -3
Reputation: 936
Here is a technique that is available from the documented API, but it does not provide visual feedback when the enter key is disabled.
- (void)setup {
// Or in init
self.textField.delegate = self;
}
// <UITextFieldDelegate>
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
// substitute your test here
return [textField.text rangeOfString:@"@"].location != NSNotFound;
}
Other answers here can be used with
[textField addTarget:self
action:@selector(validateTextField:)
forControlEvents:UIControlEventEditingChanged];
to provide dynamic visual feedback as the user types.
Upvotes: -2
Reputation: 331
You can override UITextField
's hasText
attribute to achieve this:
class CustomTextField : UITextField {
override public var hasText: Bool {
get {
return evaluateString(text)
}
}
}
Where evaluateString(_ text: String?) -> Bool
checks against your needed input criteria, for example character count.
Of course this does only work in combination with enablesReturnKeyAutomatically = true
set on the UITextField
.
I am aware that my answer is neither timely nor written in Objective-C, but given that I have not been able to find an answer anywhere else and this question being routinely referred to in other threads, I think that here is the best place to post it.
Upvotes: 33
Reputation: 39480
UITextField
's enablesReturnKeyAutomatically
property can be set right in Interface Builder, just select the textfield and open the Attributes inspector. As Tharindu stated, this will automatically enable and disable the return key depending on whether any text has been entered.
Of course, if you need to change this in code you can still set it programmatically using nameTextField.enablesReturnKeyAutomatically = true
.
EDIT to address the downvotes:
Otherwise, there is no official way to enable and disable the return key on command. I would recommend against trying to use private APIs to accomplish this. Alternatively, you can use the textFieldShouldReturn:
delegate method and put your conditional/validation there and respond accordingly.
Upvotes: 27
Reputation: 1615
One good idea is to create one file to access this class from anywhere. Here is the code:
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
Now you can import and access this class from your own class:
#import "UIKeyboard.h"
// Keyboard Instance Pointer.
UIView *keyboardView = [[UIApplication sharedApplication] keyboardView];
A full documentation of this class you can find here: http://ericasadun.com/iPhoneDocs/_u_i_keyboard_8h-source.html
More information you can find here: http://cocoawithlove.com/2009/04/showing-message-over-iphone-keyboard.html
Upvotes: 1