2011-07-15 13 views
26

Yukarıdakiler, her şeyden önce güvenliğini sağlamak için bir UITextField setim var, ancak kullanıcılara güvenli olma seçeneğini yapmalarını istedim. Özel bir alanda olduklarında ne yazdıklarını görebilirler). Ancak, fareyi yanlışlıkla değiştirdiklerini ve güvenli modda tekrar değiştirmek istediklerini varsayalım? Bu çalışmıyor. Her şeyi denedim - YES yerine -1 kullanarak, metni silerek ve sonra geri koyarak. Diğer fikirlerde tamamen kayıp yaşıyorum. [Girilen rdar: // 9781908]UITextField secureTextEntry - YES'ten NO'ya giden işler, ancak EVET'e geri dönmenin hiçbir etkisi yoktur.

DÜZENLEME: Bu sorunun iOS5'ten itibaren giderildiğini düşünüyorum.

+0

bana devlet ne olması gerektiğini belirler bazı kodu buraya bir UISwitch gelen –

+0

// Rötuş vermek //> açma-kapama çalışır, ancak bunu KAPAMADA-> etkisi yoktur AÇIK, /kalır geçiş değişen daha sonra gelen güvenli olmayan modda - (IBAction) secureSwitchAction: (UISwitch *) gönderen { \t BOOL Ison = sender.on; \t textField.secureTextEntry = isOn; } –

+1

thanku ve dikkat edin.:) –

cevap

46

Girdi odaklama sorunu olmalıdır: odaklı iken, UITextField sadece AÇIK-> KAPALI değiştirebilir yapılacak en kolay şey viewDidLoad mevcut kontrolünü gerektiği gibi daha sonra arşivden çıkarmak arşiv etmektir.

textField.enabled = NO; 
textField.secureTextEntry = YES; 
textField.enabled = YES; 
[textField becomeFirstResponder]; 

EDIT'e (dhoerl):
AÇIK> OFF-geçmek için bir sonraki hileyi dene iOS 9.3, ben bu işleri ama bir sorun vardır bulundu. Düz görünümde 3 karakter girerseniz, güvenli metne geçin, ardından bir karakter yazın, önceden var olan 3 karakter kaybolur. Temizlemek için her türlü hile denedim, sonra metni başarıyla sıfırlayın. Sonunda denetim ile oynamaya çalıştım ve yeni anahtarlı-güvenli modda çalışarak harika bir şekilde yapıştırarak yapıştırdım. Bu yüzden onu kod olarak öykünmüştüm ve şimdi her şey iyi çalışıyor - yanıt verenle de oynamaya gerek yok. İşte nihayet ile sona erdi budur:

if textview should go into secure mode and the textfield is not empty { 
     textField.text = "" 
     textField.secureTextEntry = true 

     UIPasteboard.generalPasteboard().string = password 
     textField.paste(self) 
     UIPasteboard.generalPasteboard().string = "" 
    } 
bu hamur yapmak zorunda değil tercih ediyorum

, ancak isterseniz bu bunu yapmak için bulabilirsiniz tek yolu seamless.

+1

Evet - Kontrol, ilk cevaplayıcı olmadığı sürece beklendiği gibi çalıştığını keşfettim. Küçük bir kuş bana bunun, gelecekteki iOS sürümlerinde ele alınabileceğini söyledi. –

+0

Yukarıdaki kodumu düzeltmemden önce test ettim - textField, devre dışı bırakıldığında ilk yanıtlayıcıyı açıkça reddetti. Bu, [textField beFirstResponder] ekleyerek dedi; Bir çalışma çözümünü benimkinden çok daha kolay sonuçlandı. Teşekkürler! –

+0

FYI Bu çözümü denedim ve secureTextEntry öğesinin HAYIR olarak ayarlanmasından sonra fazladan bir alana neden oldum: http://stackoverflow.com/questions/14220187/uitextfield-has-trailing-whitespace-after-securetextentry-toggle –

1

Bu soruna karşı rdar girdim, ancak bir iş buldum. Esasen, "takılı" kontrolü yeni bir programla değiştirmelisiniz.

// do in viewDidLoad 
self.passwordMemberArchive = [NSMutableData data]; 
NSKeyedArchiver *ka = [[NSKeyedArchiver alloc]  initForWritingWithMutableData:passwordMemberArchive]; 
[ka encodeObject:password]; 
[ka finishEncoding]; 
[ka release]; 


    // In the action method when you get the UISwitch action message --- 
// when your switch changes state 
if(isOn) { 
    NSString *text = [NSString stringWithString:password.text]; 
    NSKeyedUnarchiver *kua = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    UITextField *tf = [kua decodeObject]; 
    [kua finishDecoding]; 
    [kua release]; 
    tf.inputAccessoryView = textField.inputAccessoryView; 
    tf.frame = textField.frame; 

    BOOL isFirstResponder = [textField isFirstResponder]; 
    [scrollView insertSubview:tf aboveSubview:textField]; 
    if(isFirstResponder) { 
     [tf becomeFirstResponder]; 
    } 

    [textField removeFromSuperview]; 
    self.password = tf; 

    if([text length]) { 
     if(isFirstResponder) { 
      // http://stackoverflow.com/questions/1317929/insert-string-at-cursor-position-of-uitextfield 
      // Get a reference to the system pasteboard 
      UIPasteboard* lPasteBoard = [UIPasteboard generalPasteboard]; 
      // Save the current pasteboard contents so we can restore them later 
      NSArray* lPasteBoardItems = [lPasteBoard.items copy]; 
      // Update the system pasteboard with my string 
      lPasteBoard.string = text; 
      // Paste the pasteboard contents at current cursor location 
      [tf paste:self]; 
      // Restore original pasteboard contents 
      lPasteBoard.items = lPasteBoardItems; 
      [lPasteBoardItems release]; 
     } else { 
      tf.text = text; 
     } 
    } 
} else { 
    textField.secureTextEntry = NO; 
} 
+0

MikeR tarafından sağlanan daha iyi bir çözüme dikkat edin: –

22

Mike R'ın çözüm güzel, ama bu yaklaşım tercih: Sadece becomeFirstResponder tekrar gerektiğinde

BOOL wasFirstResponder; 
if ((wasFirstResponder = [passwordField isFirstResponder])) { 
    [passwordField resignFirstResponder]; 
} 
// In this example, there is a "show password" toggle 
[passwordField setSecureTextEntry:![passwordField isSecureTextEntry]]; 
if (wasFirstResponder) { 
    [passwordField becomeFirstResponder]; 
} 

O yol sana.

+0

Bu bana daha iyi bir çözüm gibi görünüyor, teşekkürler Sandy. Uygulamam için küçük bir işlevde tamamladım. – JosephH

+0

Ben sadece bu cevabı bıktım çünkü ilk cevabı denediğimde, NO. 'A karşı secureTextEntry ayarlamaya giderken metnimin sonunda gizemli bir boşluk buldum. Bu çözümde bu sorun yok. –

+0

+1 mükemmel! Beni deli ediyordum! – Groot

0

iOS ile, istediğiniz herhangi bir davranış çerçeve tarafından sağlanmazsa, hiçbir zaman "hack" yapmaya çalışmamalısınız, fikrinizi değiştirin!

İlk onun daha kolay ^^, ikinci kullanıcı bir sonraki iOS güncellemesi veya boz olmaz belli olmaz, bu nedenle uygulama için tehlikeli olabilir, bu duyarlı olmayacaktır.

, bunun yerine dibinde bir UILabel görüntüleyebilir "Kullanıcı diye güvenli bir textfield yapıştırıcı bantla şifreyi görür istiyoruz"? Ya da net şifre ile bir onay Uyarı kutusu?

+0

). popüler bir uygulama, iki yıl boyunca mağazada 5 yıldız, ve bununla ilgili yorumlar olumlu. Seçeneği değiştirebilme yeteneğinin orada olduğunu ve Apple'ın bu sorunu bildirdikten sonra bile bu sorunu çözdüğünü unutmayın. –

+0

Evet özellik burada Tabii ki, bu özellik iyi bir fikir, ben bunu hiç söylemedim! Ben sadece senin özellik canlı yapmak için temiz bir şekilde (IOS kod olarak demek) kullanmak düşünmeliyim! –

0

Sandy'nin çözümünün hızlı versiyonu.

if #available(iOS 9.2, *) { 
    passwordTextField.secureTextEntry = !passwordTextField.secureTextEntry 
} 
else { 
    let wasFirstResponder = passwordTextField.isFirstResponder() 
    if wasFirstResponder { 
     passwordTextField.resignFirstResponder() 
    } 

    passwordTextField.secureTextEntry = !passwordTextField.secureTextEntry 
    if wasFirstResponder { 
     passwordTextField.becomeFirstResponder() 
    } 
} 
İlgili konular