2015-05-22 2 views

Antwort

4

2 Möglichkeiten:

  1. ein normales Textfeld ohne die sichere Eingabeoption verwenden. Wenn ein Benutzer ein Zeichen eingibt, speichern Sie es in einer Zeichenfolgenvariablen und ersetzen Sie es im Textfeld durch das Zeichen, das Sie anstelle der Aufzählungszeichen darstellen möchten.

Hier ist der Code (wird das Passwort als $$$$ zeigen):

var password: String = "" 
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
{ 
    password = password+string 
    textField.text = textField.text+"$" 
    println("\(password)") 
    return false 
} 
  1. Schauen Sie sich die Antworten hier: UITextField secureTextEntry bullets with a custom font?
1

basierend auf Ron.Kliffer Idee habe ich bearbeitbar vollständigen Code implementiert:

// 
// PasswordTextField.swift 
// CrifanLibSwift 
// 
// Created by licrifan on 16/7/8. 
// Copyright © 2016年 licrifan. All rights reserved. 
// 

import UIKit 

class PasswordTextField: CommonTextField, UITextFieldDelegate { 
    var realText:String { 
     didSet { 
      print("self.text=\(self.text), realText=\(realText)") 

      updateMaskStr() 
     } 
    } 
    var maskChar:Character 

    init(frame: CGRect = CGRectZero, maskChar:Character = "*") { 
     print("frame=\(frame), maskChar=\(maskChar)") 

     self.realText = "" 
     self.maskChar = maskChar 

     super.init(frame: frame) 

     self.secureTextEntry = false 

     self.addTarget(self, action: #selector(self.textFiledEditingChanged(_:)), forControlEvents: UIControlEvents.EditingChanged) 

     self.delegate = self 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func updateMaskStr(){ 
     print("before update: self.text=\(self.text), self.realText=\(self.realText)") 

     //change real text to mask char 
     var maskStr = "" 
     for _ in self.realText.characters { 
      maskStr += String(self.maskChar) 
     } 

     self.text = maskStr 

     print("after update: self.text=\(self.text), self.realText=\(self.realText)") 
    } 

    func textFiledEditingChanged(textField: UITextField) { 
     print("textField=\(textField), textField.text=\(textField.text)") 

     updateMaskStr() 
    } 

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

     var allow = true 
     let curText = self.realText 
     let updatedStr:String = (curText as NSString).stringByReplacingCharactersInRange(range, withString: string) 

     if updatedStr.characters.count > LoginRegisterPasswordLengthMax { 
      print("password exceed max length \(LoginRegisterPasswordLengthMax)") 
      allow = false 
     } 

     if allow { 
      self.realText = updatedStr 
     } 

     print("curText=\(curText), updatedStr=\(updatedStr), self.realText=\(self.realText)") 

     return false 
    } 
} 

und in einer anderen Ansicht EditInfoView.swift, es zu benutzen:

class EditInfoView: UIView { 

    var passwordTextField:PasswordTextField 

    init(editMode:EditInfoMode) { 

     self.passwordTextField = PasswordTextField() 

     self.addSubview(self.passwordTextField) 

     if self.passwordTextField.notHidden { 
      //5. password text 
      var passwordPlaceholder = "密码(6-20位)" 
      if self.editMode == .ChangeLoginPassword { 
       passwordPlaceholder = "旧密码(6-20位)" 
      } else if self.editMode == .ForgotPassword { 
       passwordPlaceholder = "输入新密码(6-20位)" 
      } 

      self.passwordTextField.placeholder = passwordPlaceholder 
      self.passwordTextField.returnKeyType = UIReturnKeyType.Go 
//   self.passwordTextField.secureTextEntry = true 
      constrain(passwordTextField, smsCodeTextField, phoneTextField) {passwordTextField, smsCodeTextField, phoneTextField in 
       passwordTextField.centerX == passwordTextField.superview!.centerX 
       passwordTextField.width == passwordTextField.superview!.width - 2 * LoginRegisterPaddingX 
       passwordTextField.height == CommonTextFieldHeight 

       if self.editMode == .ChangeLoginPassword { 
        passwordTextField.top == passwordTextField.superview!.top + EditInfoViewTopPadding 
       } else { 
        passwordTextField.top == smsCodeTextField.bottom + EditInfoViewCommonPaddingY 
       } 
      } 
     } 
} 

schließlich in einem View-Controller EditInfoViewController.swift zu realem Gebrauch es:

isValid = validatePassword(self, alertPrefix: alertPrefix, passwordStr: self.editInfoView.passwordTextField.realText, doAlertWhenInvalid: doAlertWhenInvalid) 

die endgültige Wirkung:

enter image description here