Как я могу изменить точки На другой символ в поле пароля в iOS Swift

У меня есть текстовое поле, и я хотел бы заменить символ точки по умолчанию на что-то еще, когда пароль скрыт. Есть ли способ сделать это легко?

2 ответов


2 варианта:

  1. используйте обычное текстовое поле без опции безопасного ввода. Когда пользователь вводит символ, сохраните его в строковой переменной и замените его в текстовом поле символом, который вы хотите представить вместо маркеров.

вот код (покажет пароль как $$$$):

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. проверьте ответы здесь:UITextField securetextentry пули с пользовательским шрифтом?

на основе Рона.Идея Kliffer, я реализовал работоспособный полный код:

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

и в другом ракурсе EditInfoView.swift, чтобы использовать его:

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

наконец-то в контроллере вида EditInfoViewController.swift для реального использования это:

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

конечный эффект:

enter image description here