it-swarm.com.de

Großbuchstaben im UI-Textfeld

Ich habe eine Frage zu iOS UIKeyboard.

Ich habe eine UITextField und ich hätte die keyboard nur mit Großbuchstaben.

Ich verwende eine storyboard und versuchte, die Cpitalization als "All characters" auf UITextField properties zu setzen.

Aber das löst mein Problem nicht ... irgendeinen Vorschlag?

42
Safari

Setzen Sie den Textfeldtyp autocapitalizationType im UITextField auf UITextAutocapitalizationTypeAllCharacters

self.yourTexField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;

Nach dem Anruf delegieren

// Methode delegieren

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSRange lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];

    if (lowercaseCharRange.location != NSNotFound) {
        textField.text = [textField.text stringByReplacingCharactersInRange:range
                                                                 withString:[string uppercaseString]];
        return NO;
    }

    return YES;
}
84
codercat

Für diejenigen, die eine schnelle Version suchen:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
     textField.text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string.uppercaseString)

     return false
 }

Ich hatte kein Glück mit dem Ändern der Capitalization: All Characters-Eigenschaft.

Edit: Ich möchte vorschlagen, dies für Swift 4 zu verwenden

textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
15
Tim S

Ein Problem, das ich mit einigen der obigen Antworten habe, ist, dass Sie die Cursorposition verlieren, wenn Sie versuchen, textfield.text zu setzen. Wenn ein Benutzer versucht, die Mitte des Textes zu bearbeiten, springt der Cursor zum Ende .

Hier ist meine Swift-Lösung, die immer noch UITextFieldDelegate verwendet:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if textField == textFieldToUppercase {
        if string == "" {
            // User presses backspace
            textField.deleteBackward()
        } else {
            // User presses a key or pastes
            textField.insertText(string.uppercaseString)
        }
        // Do not let specified text range to be changed
        return false
    }

    return true
}
14
Dan

Die Syntax ist jetzt 

Schnell 2

textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters

Swift 3

textField.autocapitalizationType = .allCharacters
12
Eden

Setzen Sie UITextField-Eigenschaft autocapitalizationType auf UITextAutocapitalizationTypeAllCharacters. Dadurch werden alle Zeichen in Großbuchstaben angezeigt. Besuchen Sie auch here , um mehr über Textfelder zu erfahren

4
Adnan Aftab

Swift 4.0 Version:

Legen Sie zunächst den Delegaten für das Textfeld fest, das Sie in Großbuchstaben schreiben möchten, und klicken Sie auf den aktuellen ViewController.

Nach dem Hinzufügen der Erweiterung:

extension CurrentViewController: UITextFieldDelegate{

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        //refference to the textfield you want to target
        if textField.tag == 5{
            textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
            return false
        }
        return true
    }
}

Dies ist ein anderer Ansatz, den ich verwendet habe, und zwar Folgendes:

  1. Erzwingt die Großschreibung, sobald das Zeichen eingegeben wird 
  2. Erfasst Situationen, in denen der Benutzer die Feststelltaste deaktiviert, auch wenn das Textfeld auf automatische Begrenzung eingestellt ist
  3. Ermöglicht die einfache Bearbeitung
  4. Funktioniert mit Swift 2.2

Registrieren Sie zuerst eine Benachrichtigung, die aktualisiert werden soll, wenn Änderungen im Textfeld auftreten.

    textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

Implementieren Sie dann textFieldDidChange.

func textFieldDidChange(textField: UITextField) {
    textField.text = textField.text?.uppercaseString
}

Ich wählte dies, um eine Situation zu vermeiden, in der der Benutzer eine ungleiche Erfahrung von einigen Großbuchstaben sieht, die sich jedoch geändert haben, sobald sie zum nächsten Charakter wechseln.

3
CodeBender

Am einfachsten wäre es, die geänderte Bearbeitungsmethode des Textfelds zu implementieren und den Textwert des Textfelds auf Großbuchstaben des eingegebenen Textes zu setzen.

@property (nonatomic, strong) IBOutlet UITextField *yourTextfield

// add target in code or use interface builder
[self.yourTextField addTarget:self 
                       action:@selector(uppercaseTextField)
             forControlEvents:UIControlEventEditingChanged];

- (IBAction)uppercaseTextField:(UITextField*)textField
{
    textField.text = [textField.text uppercaseString];
}
1
Omkar Guhilot

Nur ein Zeilencode in ViewDidLoad/ViewDidAppear:

Wenn Sie möchten, dass die eingegebenen Zeichen unabhängig von der Groß-/Kleinschreibung in Groß-/Kleinschreibung angezeigt werden, fügen Sie den folgenden Code entweder in ViewDidLoad/ViewDidAppear ein

self.MyTextField.autocapitalizationType = .allCharacters

die obige Zeile ändert alle Buchstaben in GROSSBUCHSTABEN, während Sie automatisch tippen

1
vilas deshmukh

Sie können diesen Code auch verwenden.

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range     replacementString:(NSString *)string{

    // Uppercase for string which you need 
    textField.text = [textField.text stringByReplacingCharactersInRange:range 
                                 withString:[string uppercaseString]];

    // return NO because You have already done it in above code
    return NO;
}
1
Linh Nguyen

Hier ist meine Situation und wie ich es geschafft habe, den oberen Text zu erzwingen:

  • benutzerdefinierte Klasse (UITextField Unterklasse)
  • ich möchte keine delegate UITextFieldDelegate -Methoden verwenden

Die von @CodeBender vorgeschlagene Lösung war genau das, wonach ich gesucht habe, aber der Cursor springt immer ans Ende, wie von @Dan bemerkt.

class MyCustomTextField: UITextField {
...
addTarget(self, action: #selector(upperText), for: .editingChanged)
...
...
@objc private func upperText() {
    let textRange = selectedTextRange
    text = text?.uppercased()
    selectedTextRange = textRange
}

Dies setzt den Cursor immer an die richtige Position (wo er war), auch wenn der Benutzer Text in "der Mitte" hinzufügt.

0
magpie
/**
 We take full control of the text entered so that lowercase cannot be inserted
 we replace lowercase to uppercase
*/
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // No spaces allowed
    if string == " " {
        return false
    }

    // delete key pressed
    if string == "" {
        textField.deleteBackward()
        return false
    }

    // We only allow alphabet and numbers
    let numbersAndLettersSet = CharacterSet.alphanumerics
    if string.lowercased().rangeOfCharacter(from: numbersAndLettersSet) == nil {
        return false
    }

    // Add the entered text
    textField.insertText(string.uppercased())

    // Return false as we are doing full control
    return false
}
0
Chris

Vielleicht ist es für eine Antwort hier zu spät, aber da ich eine funktionierende Lösung habe, könnte es für jemanden nützlich sein.

Überprüfen Sie in der folgenden Textfeld-Delegatenmethode, ob die neue Zeichenfolge Kleinbuchstaben enthält. Wenn ja, dann

  • Hängen Sie das soeben eingegebene Zeichen an den Text des Textfelds an.
  • Den gesamten Text des Textfelds in Großbuchstaben setzen.
  • Stellen Sie sicher, dass false von der Methode zurückgegeben wird.

Andernfalls geben Sie einfach true zurück und lassen die Methode wie erwartet funktionieren.

Hier ist die Implementierung:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    var returnValue = true
    let lowercaseRange = string.rangeOfCharacter(from: CharacterSet.lowercaseLetters)
    if let _ = lowercaseRange?.isEmpty {
        returnValue = false
    }

    if !returnValue {
        textField.text = (textField.text! + string).uppercased()
    }

    return returnValue
}

Das obige hat perfekt für mich funktioniert, und eine ähnliche Implementierung funktioniert auch für Textansichten, nachdem natürlich zuerst die richtigen Einstellungen vorgenommen wurden.

Ich hoffe es hilft!

0
Gabriel T.

Schließlich habe ich in UITextField den Weg gefunden, der auch die Bearbeitung von Text in der Mitte des Strings berücksichtigt. 

Das Problem ist, dass, wenn Sie den gesamten Text durch die UITextFiled.text-Eigenschaft ersetzen, der tatsächliche Cursor zum Ende des Textes verschoben wird. Daher müssen Sie die Methode .replace() verwenden, um genau anzugeben, welche Zeichen Sie auf upperCase aktualisieren möchten. 

Als letztes müssen Sie string.isEmpty als Rückgabewert der Funktion zurückgeben - sonst lassen Sie das Löschen von Text nicht zu.

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let text = textField.text, let textRange = Range(range, in: text) {
        let uppercasedString = string.uppercased()
        let updatedText = text.replacingCharacters(in: textRange, with: uppercasedString)
        if let selectedTextRange = textField.selectedTextRange {
            textField.replace(selectedTextRange, withText: uppercasedString)
            approveButtonState(vin: updatedText)
        }
        return string.isEmpty
    }
    return false
}
0
Marek Staňa