【发布时间】:2016-04-28 21:34:45
【问题描述】:
我正在创建一个在启动时要求输入用户名的琐事应用程序。我想让它无法使用 #$@!^& 等字符(也包括“空格”)。我看了这篇帖子here,但它完全是用Objective-C编写的。提前致谢。
【问题讨论】:
-
我已经为使用 Swift 的原始问题添加了答案。
标签: swift swift2 uitextfield
我正在创建一个在启动时要求输入用户名的琐事应用程序。我想让它无法使用 #$@!^& 等字符(也包括“空格”)。我看了这篇帖子here,但它完全是用Objective-C编写的。提前致谢。
【问题讨论】:
标签: swift swift2 uitextfield
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 组成的字符;所以我猜要谨慎使用。
【讨论】:
由于您明确要求使用 Swift,我已经翻译了链接问题中的顶部答案。
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;
}
【讨论】:
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.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
}
}
}
【讨论】:
所以这可能是限制空间最有效的方法。使用此用户将无法粘贴/键入 空格
这是使用 Swift 3 实现的方法。
将下面提到的extensionsn-p 添加到 Swift 文件中;
extension String {
var containsWhitespace: Bool {
for scalar in unicodeScalars {
switch scalar.value {
case 0x20:
return true
default:
continue
}
}
return false
}
}
在您的 ViewController Swift 文件中,从 Storyboard 中拖出您的 Editing Changed 实例和 UITextField 的 Reference Outlet,如下图所示:
使用拖拽的Instances如下:
引用插座为:
@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.")
}
}
这将在用户尝试键入/粘贴它时检测并删除空格。
【讨论】:
Swift 4 iOS 11.2.x 基于使用扩展,在本例中测试字符串是否为有效的十六进制数字。
扩展字符串{
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)
}
【讨论】:
Swift : 3 和不同的方法:
为 viewDidLoad 中的文本字段更改添加目标函数:
override func viewDidLoad() {
super.viewDidLoad()
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
}
在目标函数中,只需检测输入的字符并将其替换为空白即可。我已经对其进行了测试,它可以防止用户在文本字段中输入任何不需要的字符。
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))
}
}
}
}
【讨论】:
补充@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;
}
【讨论】:
if !(string.range(of:"^[0-9]+$", options: .regularExpression) != nil) { valid = false } 检查 0-9,A-Z:if !(string.range(of:"^[0-9A-Z]+$", options: .regularExpression) != nil) { valid = false }