我正在创建一个琐事应用程序,要求在启动时使用用户名。我想不可能使用诸如#$ @!^&之类的字符。等等(也包括"空间")。我看了一下这篇文章here,但它完全是用Objective-C编写的。提前谢谢。
答案 0 :(得分:3)
由于你明确要求使用Swift,我已经在链接问题中翻译了顶部asnwer。
let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
func textField(
textField: UITextField,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String)
-> Bool
{
let set = NSCharacterSet(charactersInString: notAllowedCharacters);
let inverted = set.invertedSet;
let filtered = string
.componentsSeparatedByCharactersInSet(inverted)
.joinWithSeparator("");
return filtered != string;
}
答案 1 :(得分:2)
internal func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
if let text = string{
if text == "#" || text == "$" || text == "!"{ \\and so on
return false
}
}
return true
}
答案 2 :(得分:1)
Swift 2.3
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let characters = ["#", "$", "!", "&","@"]
for character in characters{
if string == character{
print("This characters are not allowed")
return false
}
}
}
答案 3 :(得分:1)
因此,这可能是限制空间的最强大方式。使用此用户无法粘贴/输入 空白
这是您使用 Swift 3 实现的方法。
将下面提到的extension
代码段添加到Swift文件中;
extension String {
var containsWhitespace: Bool {
for scalar in unicodeScalars {
switch scalar.value {
case 0x20:
return true
default:
continue
}
}
return false
}
}
在您的ViewController
Swift文件中,从故事板中拖出编辑已更改实例和UITextField
的引用插座,图中提到的那个下面:
使用下面提到的拖动实例:
将Outlet引用为:
@IBOutlet weak var textField: UITextField!
和编辑更改为:
@IBAction func textChanged(_ sender: UITextField) {
if (textField.text!.containsWhitespace) == true {
print("Restrict/Delete Whitespace")
emailField.deleteBackward()
} else {
print("If Its not Whitespace, Its allowed.")
}
}
只要用户尝试输入/粘贴,就会检测并删除空白。
答案 4 :(得分:1)
基于使用扩展程序的Swift 4 iOS 11.2.x,在此示例中测试字符串是否为有效的十六进制数。
extension String {
var containsValidCharacter: Bool {
guard self != "" else { return true }
let hexSet = CharacterSet(charactersIn: "1234567890ABCDEFabcdef")
let newSet = CharacterSet(charactersIn: self)
return hexSet.isSuperset(of: newSet)
}
}
您可以像使用UITextFieldDelegate一样使用它。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return (string.containsValidCharacter)
}
答案 5 :(得分:1)
基于使用扩展程序的Swift 4 iOS 11.2.x,在此示例中测试字符串是否为有效的十六进制数。
extension String {
var containsValidCharacter: Bool {
guard self != "" else { return true }
let hexSet = CharacterSet(charactersIn: "1234567890ABCDEFabcdef")
let newSet = CharacterSet(charactersIn: self)
return hexSet.isSuperset(of: newSet)
}
}
您可以像使用UITextFieldDelegate一样使用它。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return (string.containsValidCharacter)
}
虽然我在之前的帖子中读到,CharacterSets不支持由多个Unicode.Scalar组成的字符;所以我猜是谨慎使用。
答案 6 :(得分:0)
Swift:3和另一种方法:
在viewDidLoad中添加文本字段更改的目标函数:
override func viewDidLoad() {
super.viewDidLoad()
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
}
在目标函数中,只需检测输入的char并将其替换为空白。我测试了它,它可以防止用户在文本字段中输入任何不需要的字符。
func textFieldDidChange(textField: UITextField) {
if let textInField = textField.text{
if let lastChar = textInField.characters.last{
//here include more characters which you don't want user to put in the text field
if(lastChar == "*")
{
textField.text = textInField.substring(to: textInField.index(before: textInField.endIndex))
}
}
}
}
答案 7 :(得分:0)
补充说@Evdzhan Mustafa说的话。如果字符串为空,您想要添加一个return语句。没有它你将无法删除你的文字。修改后的代码:
Swift 3版
let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.isEmpty{
return true
}
print("String: \(string)")
let set = NSCharacterSet(charactersIn: notAllowedCharacters);
let inverted = set.inverted;
let filtered = string.components(separatedBy: inverted).joined(separator: "")
print("String Filtered: \(filtered)")
return filtered != string;
}