Ho un campo di testo e vorrei sostituire il carattere punto predefinito con qualcos'altro quando la password è nascosta. C'è un modo per farlo facilmente?Come posso modificare i punti su un altro carattere nel campo della password in iOS Swift
6
A
risposta
4
2 opzioni qui:
- 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
}
- 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 è:
Well , non è un'opzione built-in, se è quello che stai chiedendo; dovresti scrivere la sottoclasse UITextField. – matt