【发布时间】:2017-04-03 09:28:02
【问题描述】:
我想制作只接受小写字母而不是大写字母或任何特殊符号或任何数字的文本字段。
【问题讨论】:
标签: ios swift3 uitextfield
我想制作只接受小写字母而不是大写字母或任何特殊符号或任何数字的文本字段。
【问题讨论】:
标签: ios swift3 uitextfield
您可以使用正则表达式,例如下面只允许小符号的正则表达式
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.isEmpty {
return true
}
let regex = "[a-z]{1,}"
return NSPredicate(format: "SELF MATCHES %@", regex).evaluate(with: string)
}
【讨论】:
class ViewController: UIViewController, UITextFieldDelegate),然后将 usernameTextField.delegate = self 添加到 viewDidLoad。
试试下面的代码,它只会自动获取小写字母。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textEntry: UITextField!
//MARK : - Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
textEntry.addTarget(self, action: #selector(self.textFieldDidChange), for: .editingChanged)
}
//MARK: - Lower letter function
func textFieldDidChange(sender: UITextField) {
sender.text = sender.text?.lowercased()
print(textEntry.text ?? "") //Check your text output here
}
}
【讨论】:
你也可以用这个,
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Return false when user tries to delete but textField is empty
let currentCharacterCount = textField.text?.characters.count ?? 0
if (range.length + range.location > currentCharacterCount) {
return false
}
// Return true when user tries to delete but textField is not empty
if string == "" {
return true
}
let userEnteredString = textField.text ?? ""
let newString = (userEnteredString as NSString).replacingCharacters(in: range, with: string) as NSString
return ((newString as String).range(of: "^[a-z]+$", options: .regularExpression) != nil)
}
【讨论】:
要限制大写字母、数字和特殊符号,请在文本视图委托方法 textField:shouldChangeCharactersInRange: 中返回除小写字母以外的 false。
Swift 3.0:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var myCharSet = CharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyz")
for i in 0..<(string.characters.count ?? 0) {
var c: unichar = string[i]
if !myCharSet.characterIsMember(c) {
return false
}
}
return true
}
【讨论】:
检查这个更新的代码:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSLog(@"textField:shouldChangeCharactersInRange:replacementString:");
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyz"];
for (int i = 0; i < [string length]; i++)
{
unichar c = [string characterAtIndex:i];
if (![myCharSet characterIsMember:c])
{
return NO;
}
}
return YES;
}
}
在 Swift 中
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let set = NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyz").invertedSet
return string.rangeOfCharacterFromSet(set) == nil
}
【讨论】:
你必须用你自己的类继承 UITextFieldDelegate 类
class ViewController: UIViewController, UITextFieldDelegate {
添加一个 IBOutlet
@IBOutlet weak var firstName: UITextField!
你必须确保这个对象正在使用
override func viewDidLoad() {
super.viewDidLoad()
firstName.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == firstName {
let allowedCharacters = "abcdefghijklmnopqrstuvwxyz"
let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
let typedCharacterSet = CharacterSet(charactersIn: string)
let alphabet = allowedCharacterSet.isSuperset(of: typedCharacterSet)
return alphabet
}
}
【讨论】:
UITextFieldDelegate,而不是UITextViewDelegate(因为您使用的是TextField),否则会出现错误:Cannot assign value of type 'ViewController' to type 'UITextFieldDelegate?'将其更改为建议的self as! UITextFieldDelegate然后抛出一个Thread 1: signal SIGABRT.