Wie deaktiviere / aktiviere ich den Return-Schlüssel in einem UITextField?

75

Gibt es eine Möglichkeit, die Eingabetaste auf dem programmgesteuert zu aktivieren oder zu deaktivieren UIKeyboard? Das nächste, was ich finden konnte, ist enablesReturnKeyAutomatically, aber das zeigt nur, ob es überhaupt deaktiviert werden soll.

Sophie Alpert
quelle
Siehe meine Antwort auf die doppelte Frage hier
Winston Du

Antworten:

86

Möglicherweise hilft das folgende Codesegment:

textfield.enablesReturnKeyAutomatically = YES;

Dies ist im iPhone SDK in UITextInputTraits öffentlich verfügbar. Mit dieser Option wird die Eingabetaste deaktiviert, wenn im Textfeld kein Eingabetext verfügbar ist.

Tharindu Madushanka
quelle
2
In Swift: textfield.enablesReturnKeyAutomatically = true
AmyNguyen
3
Klingt vielleicht albern, aber ich wollte diese Antwort, als ich hierher kam. Wie ich glaube, viele Leute, habe ich blind auf den ersten Link geklickt, der in Google
aufgetaucht ist
28

UITextFieldDie enablesReturnKeyAutomaticallyEigenschaft von 'kann direkt im Interface Builder festgelegt werden. Wählen Sie einfach das Textfeld aus und öffnen Sie den Attributinspektor. Wie Tharindu sagte, wird dadurch die Eingabetaste automatisch aktiviert und deaktiviert, je nachdem, ob Text eingegeben wurde.

Geben Sie hier die Bildbeschreibung ein

Wenn Sie dies im Code ändern müssen, können Sie ihn natürlich weiterhin programmgesteuert festlegen nameTextField.enablesReturnKeyAutomatically = true.

BEARBEITEN, um die Abstimmungen zu adressieren:

Andernfalls gibt es keine offizielle Möglichkeit, die Eingabetaste auf Befehl zu aktivieren und zu deaktivieren. Ich würde davon abraten, private APIs zu verwenden, um dies zu erreichen. Alternativ können Sie die textFieldShouldReturn:Delegate-Methode verwenden und Ihre Bedingung / Validierung dort ablegen und entsprechend reagieren.

Kyle Clegg
quelle
27

Sie können das Attribut überschreiben UITextField, hasTextum dies zu erreichen:

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

Hier evaluateString(_ text: String?) -> Boolwerden die erforderlichen Eingabekriterien überprüft, z. B. die Anzahl der Zeichen.

Dies funktioniert natürlich nur in Kombination mit dem enablesReturnKeyAutomatically = trueSet am UITextField.

Ich bin mir bewusst, dass meine Antwort weder aktuell noch in Objective-C geschrieben ist, aber da ich nirgendwo anders eine Antwort finden konnte und diese Frage routinemäßig in anderen Threads erwähnt wird, denke ich, dass hier der beste Ort dafür ist veröffentliche es.

Janne
quelle
Dies funktioniert, führt jedoch dazu, dass das Kennwort keyboardAccessory niemals verschwindet.
Sethmr
1

Eine gute Idee ist es, eine Datei zu erstellen, um von überall auf diese Klasse zuzugreifen. Hier ist der 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

Jetzt können Sie diese Klasse aus Ihrer eigenen Klasse importieren und darauf zugreifen:

#import "UIKeyboard.h"

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

Eine vollständige Dokumentation dieser Klasse finden Sie hier: http://ericasadun.com/iPhoneDocs/_u_i_keyboard_8h-source.html

Weitere Informationen finden Sie hier: http://cocoawithlove.com/2009/04/showing-message-over-iphone-keyboard.html

SEQOY Entwicklungsteam
quelle
12
App Store Ablehnungswahrscheinlichkeit: 100%
Ich denke nicht, dass dies einer Ablehnung würdig ist. Wir iterieren nur über Unteransichten und wählen die aus, die uns gefällt. Es ist praktisch, beantwortet jedoch nicht die Frage, ob die Eingabetaste deaktiviert werden soll.
Rushabh
1
Dies ist nur eine wirklich schlechte Idee ... außer dass Apple Sie ablehnt, könnte sich das System-Setup ändern, ohne dass Sie diese Lösung kennen und brechen.
Zorayr
0

Meine Antwort auf die doppelte Frage , kopiert über :

Alle anderen Lösungen beantworten die Frage nicht. OP möchte die Eingabetaste auf der Tastatur als visuelles Signal an den Benutzer "grau" machen.

Hier ist meine Lösung für iOS 13. Möglicherweise müssen Sie die Lösung für andere iOS-Versionen geringfügig ändern.

Zuerst erweitere ich 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
    }

Wenn ich dann den "Return" -Schlüssel deaktivieren muss, können wir Folgendes tun (durch delegateden Variablennamen Ihres Delegatenobjekts ersetzen ):

if let keyboard = delegate.getKeyboard(){
    keyboard.setValue(text == nil, forKey: "returnKeyEnabled")
}
Winston Du
quelle
-1

Hier ist eine Technik, die über die dokumentierte API verfügbar ist, jedoch kein visuelles Feedback liefert, wenn die Eingabetaste deaktiviert ist.

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

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

Andere Antworten hier können mit verwendet werden

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

um dynamisches visuelles Feedback zu geben, während der Benutzer tippt.

Rik Renich
quelle
-2

Versuchen Sie ein UITextField zu verwenden! um diese Zeichenfolge zu erhalten und dann sind die Rückgabe weg!

Jean Luiz
quelle