2013-01-08 11 views
26

Ho un pulsante che commuta tra la modalità Mostra/Nascondi (ad esempio, attiva un campo UIText tra secureTextEntry NO e YES). Lo scopo di questo è consentire all'utente di vedere la password che stanno inserendo.UITextField ha uno spazio vuoto dopo secureTextEntry toggle

ho seguito l'esempio (con il maggior numero di voti) qui: UITextField secureTextEntry - works going from YES to NO, but changing back to YES has no effect

Tuttavia, quando ho impostato secureTextEntry su NO, qualsiasi testo che è stato scritto non finisce con uno spazio alla fine. Questo non sembra essere un problema quando si imposta secureTextEntry su YES.

Ad esempio, se si immette il testo "mypassword" mentre setSecureTextEntry è impostato su NO e quindi si passa a YES, l'utente vedrà ********** (10 punti), che è corretta. Se setSecureTextEntry su NO, l'utente vedrà "mypassword" (con uno spazio alla fine, o almeno, il cursore si è spostato di uno spazio a destra).

Nota importante: Nel debugger, il valore stringa di testo appare senza lo spazio finale, in questo modo:

(lldb) expr self.passwordText.text 
(NSString *) $0 = 0x1d8450e0 @"mypassword" 

Ho cercato taglio spazi bianchi (per avoid middle whitespace in UITextField), ma ha avuto nessun effetto

+1

penso iOS continua ad attirare il cursore lampeggiante nella stessa posizione.I punti sono più larghi del testo, quindi c'è sempre uno spazio tra il testo e il cursore. Lo "spazio bianco" non è realmente nella casella di testo, ma sembra proprio a causa della posizione del cursore. – russau

risposta

10

PRE-IOS-8.0 (soluzione datato). .. Nel metodo di azione del pulsante (alternando tra secureTextEntry YES e NO), è sufficiente impostare la proprietà texttext al valore corrente text. Sebbene questo possa sembrare ridondante e un po 'come un hack, questo ridisegnerà il cursore nella giusta posizione. Ecco un esempio di ciò che metodo di azione del pulsante dovrebbe apparire come adesso ...

-(void)toggleButtonPressed:(UIButton*)sender 
{ 
    // Toggle between secure and not-so-secure entry 
    self.toggleButton.selected = !self.toggleButton.selected; 
    self.textfield.secureTextEntry = !self.toggleButton.selected; 

    // * Redundant (but necessary) line * 
    [self.textfield setText:self.textfield.text]; 
} 

POST-IOS-8.0 ... Come di iOS 8.0, sembra che UITextField s' text setter non è più ridisegna il cursore quando chiamato con una stringa uguale al suo valore di stringa corrente. Ora, dobbiamo fare un ulteriore passo avanti e modificare effettivamente il valore text prima di resettarlo nuovamente. Sostituire la linea setText: sopra con qualcosa di simile a queste linee.

// * Extra redundant (but necessary) lines * 
NSString *currentText = self.textfield.text; 
[self.textfield setText:@"Arbitrary string..."]; // Change the value 
[self.textfield setText:currentText]; // Reset the value 
+6

Questo non funziona in iOS 8.1. – sethfri

+0

Hai ragione - sembra che il text & setter di iOS 8.0+ di UITextField ora ignori le stringhe duplicate ... Grazie a @sethfri e ad altri commentatori. – Matthew

+0

Funzionava alla grande in 9.3 'textField.text = textField.text' (dopo aver inserito il testo protetto) – SuitedSloth

3

Questo lavoro per me su iOS 8

if (self.passwordTextField.secureTextEntry) { 
    // Display password and keep selected text range 
    UITextRange *selectedTextRange = self.passwordTextField.selectedTextRange; 
    NSString *password = self.passwordTextField.text; 
    self.passwordTextField.secureTextEntry = NO; 
    self.passwordTextField.text = [@"" stringByPaddingToLength:password.length withString:@" " startingAtIndex:0]; // Done for carret redrawing 
    self.passwordTextField.text = password; 
    self.passwordTextField.selectedTextRange = selectedTextRange; 
} 
else { 
    // Hide password and keep selected text range 
    UITextRange *selectedTextRange = self.passwordTextField.selectedTextRange; 
    NSString *password = self.passwordTextField.text; 
    self.passwordTextField.secureTextEntry = YES; 
    self.passwordTextField.text = [@"" stringByPaddingToLength:password.length withString:@" " startingAtIndex:0]; // Done for carret redrawing 
    self.passwordTextField.text = password; 
    self.passwordTextField.selectedTextRange = selectedTextRange; 
} 
3
UITextPosition *beginning = [self.passwordField beginningOfDocument]; 
[self.passwordField setSelectedTextRange:[self.passwordField textRangeFromPosition:beginning 
                     toPosition:beginning]]; 

UITextPosition *end = [self.passwordField endOfDocument]; 
[self.passwordField setSelectedTextRange:[self.passwordField textRangeFromPosition:end 
                     toPosition:end]]; 

Questo è quello che ho usato per iOS 8

2

Quando cambiamo una proprietà textfield.secureTextEntry, la posizione del cursore non è aggiornato. Per risolvere questo problema, il codice seguente funzionava prima di IOS 8:

pwdTextField.text = pwdTextField.text 

Ora non è così. Sembra che IOS 8 rilevi che il nuovo valore è uguale al vecchio valore e non fa nulla. Quindi, per farlo funzionare di nuovo, dobbiamo effettivamente cambiare il valore. Ecco la versione rapida che funziona per me.

let str = pwdTextField.text 
pwdTextField.text = str + " " 
pwdTextField.text = str 
28

ho appena incontrato questo caso e finalmente risolto questo problema.

lavori su iOS ultimo SDK, iOS 8.1

Prima di tutto, non c'è spazio finale a tutti.

Il punto (mostrato nel carattere SecureEntry) e il carattere normale hanno larghezza diversa e dopo aver attivato l'interruttore isSecureEntry, il cursore non ha aggiornato la posizione.

quindi utilizzo questa soluzione alternativa per risolvere questo problema.

- (void)toggle 
{ 
    NSString *tmpString; 
    [self.passwordTextField setSecureTextEntry:!self.passwordTextField.isSecureTextEntry]; 
    if (self.passwordTextField.isSecureTextEntry) { 
     // do stuffs 
    } else { 
     // do other stuffs 
    } 
    // Workaround to refresh cursor 
    tmpString = self.passwordTextField.text; 
    self.passwordTextField.text = @" "; 
    self.passwordTextField.text = tmpString; 
} 

spero che sia d'aiuto!

+0

Salvato con me :) – Leena

+0

Quelle 3 righe per l'aggiornamento del cursore si liberano dello spazio vuoto' // Soluzione alternativa per aggiornare il cursore tmpString = self.passwordTextField.text; self.passwordTextField.text = @ ""; self.passwordTextField.text = tmpString; ' –

2

Questa è un'altra possibilità per risolvere questo problema, dove self.passwordText è l'UITextField:

if (self.passwordText.isFirstResponder) { 
    [self.passwordText resignFirstResponder]; 
    [self.passwordText becomeFirstResponder]; 
} 
5

Al fine di ovviare a questo bug in iOS si può semplicemente effettuare le seguenti operazioni (funziona per qualsiasi versione di iOS) :

- (IBAction)toggleSecureTextEntry:(UIButton *)button 
{ 
    self.textField.secureTextEntry = !self.textField.secureTextEntry; 
    NSString *originalText = self.textField.text; 
    self.textField.text = nil; 
    self.textField.text = originalText; 
} 
+2

Funziona su iOS8 e deve essere contrassegnato come" Risposta " – bubuxu

1

Questo funziona nel mio caso

BOOL wasFirstResponder = [self.passwordTextField isFirstResponder]; 
    if([self.passwordTextField isSecureTextEntry]) 
    { 
     //This three lines are key 
     self.passwordTextField.delegate = nil; 
     [self.passwordTextField resignFirstResponder]; 
     self.passwordTextField.delegate = self; 
    } 

    [self.passwordTextField setSecureTextEntry: !self.passwordTextField.isSecureTextEntry]; 
    if(wasFirstResponder) 
     [self.passwordTextField becomeFirstResponder]; 
0

Per ottenere i cagnacci o per riposizionare correttamente, l'impostazione degli attributi del font sembrava fare il trucco per me.

// Hack to update cursor position 
self.passwordTf.defaultTextAttributes = @{NSFontAttributeName: textFieldFont, NSForegroundColorAttributeName: textFieldColor}; 

// Change secure entry 
self.passwordTf.secureTextEntry = !self.passwordTf.secureTextEntry; 

Testato su iOS8, iOS9. Spero che aiuti!

2

È possibile risolvere il problema in questo modo:

NSString *currentText = self.textfield.text; 
self.textfield.text = @""; 
self.textfield.text = currentText; 
4

ho una soluzione pulita non andare sporca con text proprietà di UITextField.

Avvolgili in questo stile.

[self.passwordTextField resignFirstResponder]; // first resign its first responder. 

// change `secureTextEntry` property's value if necessary. 

if (self.passwordTextField.secureTextEntry) { 
    self.passwordTextField.secureTextEntry = NO; 
    self.passwordEcryptButton.selected = YES; 
}else{ 
    self.passwordTextField.secureTextEntry = YES; 
    self.passwordEcryptButton.selected = NO; 
} 

[self.passwordTextField becomeFirstResponder]; // finally gain its first responder again. 
+0

Eccellente. Funziona anche su iOS 11. Grazie! –

0

Ogni volta il testo si trova nel UITextField, fendinebbia cursore viene aggiornato

Così ho usato questo codice

partial void btnShowPassword_ToutchUpInside (UIButton sender) 
    { 
     if (TxtPassword.SecureTextEntry == true) { 
      TxtPassword.SecureTextEntry = false; 
      TxtPassword.Text = TxtPassword.Text; 
     } else { 
      TxtPassword.SecureTextEntry = true; 
     } 
    } 
1

Swift UITextField estensione:

extension UITextField { 
    func toggleSecureEntry() { 
     let wasFirstResponder = isFirstResponder() 

     if wasFirstResponder { resignFirstResponder() } 
     secureTextEntry = !secureTextEntry 
     if wasFirstResponder { becomeFirstResponder() } 
    } 
} 

Impostazione textField La soluzione .text funziona anche in alcune situazioni ma non per il mio bisogno (carattere personalizzato con due campi di testo aggiunta di font e glitch in runtime. Aggiunta anche qui.

func toggleSecureEntry() { 
    secureTextEntry = !secureTextEntry 
    let originalText = text 
    text = nil 
    text = originalText 
} 
0

Sto usando questo, Funziona bene. Felice di codifica

[self.yourTextField becomeFirstResponder]; 
Problemi correlati