2015-05-22 2 views

risposta

4

2 opzioni qui:

  1. Utilizzare un campo di testo normale senza l'opzione di ingresso sicuro. Quando un utente inserisce un personaggio, salvalo in una variabile stringa e sostituiscilo nel campo di testo con il personaggio che desideri presentare invece dei proiettili.

Ecco il codice (mostrerà la password come $$$$):

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. check out le risposte qui: UITextField secureTextEntry bullets with a custom font?
1

basato sull'idea di Ron.Kliffer, ho implementato codice completo lavorabile:

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

e in un'altra vista EditInfoView.swift, usarlo:

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

infine in un controller di vista EditInfoViewController.swift uso reale esso:

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

l'effetto finale è:

enter image description here