我有一个带有多UITextFields的视图控制器,几乎每个文本字段都必须用某些字符限制。我正在使用此代码:
find_or_initialize_by
它运行良好,但它适用于所有UITextFields,如何才能使它仅适用于某个文本字段?
答案 0 :(得分:2)
您可以将textField
与您要限制输入的内容进行比较
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == self.firsNameTxf {
return string.rangeOfCharacter(from: CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")) == nil }
else {
return true
}
}
答案 1 :(得分:1)
这是一种委托方法,每次按下键盘上的字符时都会调用该方法,如果它在所有文本视图中全局工作,则表示您拥有一个代表所有文本视图的类。
为了避免这种情况,您可以轻松地检查正在调用它的代理内部,并将此行为仅用于一个。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard textField === noChartextField else {
return true
}
return string.rangeOfCharacter(from: CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")) == nil
}
请注意,在这里您可以使用标识运算符===
,因为您只是检查textField
和noChartextField
是否指向相同的内存地址。我想==
可以正常工作,因为UItextField
继承自NSObject
,其中方法-isEqual
如果没有被覆盖则会检查指针相等性。
答案 2 :(得分:0)
请在委托方法中添加texfield条件,如:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == firestTextField || textField == secondTextField {
return string.rangeOfCharacter(from: CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")) == nil
}
return true
}