2013-01-08 134 views
26

我有一個在顯示/隱藏模式(即切換secureTextEntry NO和YES之間的UITextField)之間切換的按鈕。其目的是讓用戶看到他們輸入的密碼。UITextField在secureTextEntry切換後有空格後面的空格

我跟着例子(帶票的最高數字)位置:UITextField secureTextEntry - works going from YES to NO, but changing back to YES has no effect

但是,當我設置secureTextEntry爲NO,這是寫有任何文本,並在最後一個空格結束。將secureTextEntry設置爲YES時,這似乎不成問題。

例如,如果我在setSecureTextEntry設置爲NO時輸入文本「mypassword」,然後將其切換爲YES,則用戶將看到**********(10個點),即正確。如果我將SetSecureTextEntry設置爲NO,用戶將看到「mypassword」(末尾有空格,或者至少光標向右移動一個空格)。

重要提示:在調試器,文本字符串值出現沒有後間隔,就像這樣:

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

我試圖微調空白(每avoid middle whitespace in UITextField),但它已沒有影響。

+1

我認爲iOS的繼續吸引閃爍的光標在同一位置。點比文本寬,所以文本和光標之間總會有間隙。 '空白'並不在文本框中,它看起來像是因爲光標的位置。 – russau

回答

10

PRE-IOS-8.0 (過時溶液)。 ..在按鈕的操作方法(在secureTextEntry YES和NO之間切換),只需將UITextFieldtext屬性設置爲其當前的text值。雖然這可能看起來多餘,有點像黑客攻擊,但會將光標重新繪製在正確的位置。這裏是你的按鈕的操作方法應該是什麼樣子,現在的例子...

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

後的iOS 8.0 ...作爲的iOS 8.0的,看來UITextFieldtext二傳手不再重新繪製光標時用與當前字符串值相等的字符串調用。現在,我們需要更進一步,在重新設置之前實際更改text的值。將上面的setText:行替換爲類似這些行的內容。

// * 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

這在iOS 8.1中不起作用。 – sethfri

+0

你是對的 - 它看起來像UITextField的iOS 8.0+文本''setter現在忽略重複的字符串...謝謝@sethfri和其他評論者。 – Matthew

+0

這在9.3'textField.text = textField.text'很好用(切換安全文本輸入後) – SuitedSloth

3

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

這對我來說這項工作是我用於iOS的8

2

當我們改變textfield.secureTextEntry屬性,光標位置不更新。爲了解決這個問題,下面的代碼用於在IOS 8之前工作:

pwdTextField.text = pwdTextField.text 

現在不行。看來IOS 8檢測到的新值等於舊值,什麼都不做。所以爲了再次運作,我們必須改變價值。這裏是適合我的快速版本。

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

我剛剛遇到這種情況,終於解決了這個問題。

作品在最新的iOS SDK,iOS的8.1 ​​

首先,有沒有尾隨空間可言。

點(在SecureEntry中顯示)字符和普通字符具有不同的寬度,並且在切換isSecureEntry開關後,光標未刷新其位置。

所以我使用此解決方法來解決此問題。

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

希望它有幫助!

+0

謝謝:) – Leena

+0

遊標刷新的那3行刪除了空白區域// //刷新遊標的解決方法 tmpString = self.passwordTextField.text; self.passwordTextField.text = @「」; self.passwordTextField.text = tmpString;' –

2

這是解決這個問題的另一種可能性,其中self.passwordText是的UITextField:

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

爲了解決這個bug在iOS中,你可以簡單地做以下(適用於任何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

這適用於iOS8,應該標記爲「答案」 – bubuxu

1

這部作品在我的情況

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

爲了讓小人或者要正確地重新定位,設置字體屬性似乎對我來說是個訣竅。

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

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

在iOS8,iOS9上測試。 希望它有幫助!

2

你能解決這個問題是這樣的:

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

我有一個乾淨的解決方案不會髒的UITextFieldtext財產。

用這種風格包裝它們。

[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

非常好。也適用於iOS 11。謝謝! –

0

每次文本中的UITextField設置,光標postition更新

所以我用這個代碼

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

斯威夫特的UITextField擴展:

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

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

設置文本框.text解決方案也適用於某些情況,但不適合我的需要(具有兩個文本字段的自定義字體在運行時會自動更改字體和毛刺。)也在這裏添加。

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

我用這個,工作正常。快樂編碼

[self.yourTextField becomeFirstResponder];