我试图获取UITextField的名称,以便在shouldChangeCharactersIn中使用。 (我已经使用.tag来保存其他一些数据)。我试图使用这个代码转换为Swift 4:
func propertyName(_ property: Any?) -> String? {
var numIvars: UInt = 0
var key: String? = nil
let ivars: Ivar? = class_copyIvarList(type(of: self), numIvars)
for i in 0..<Int(numIvars) {
let thisIvar = ivars[i] as? Ivar
if (object_getIvar(self, thisIvar) == property) {
key = String(utf8String: ivar_getName(thisIvar))
break
}
}
free(ivars)
return key
}
我发现here但是收到错误“无法将类型'UInt'的值转换为预期的参数类型'UnsafeMutablePointer?”
我的目标是确定当前选择哪个UITextField进行编辑(我需要根据使用shouldChangeCharactersIn编辑的字段来限制最大字符数。)
提前致谢。
更新#1 :我无法将UITextFields与outlet属性进行比较,因为这些字段是tableview的一部分并且是动态创建的。
答案 0 :(得分:0)
当我到了shouldChangeCharactersIn时,我能够识别UITextField的名称。如果有人有更好的方法,请发布它,但这对我来说非常适合。以下是解决问题的步骤:
为视图控制器创建一个全局变量,以保存正在编辑的字段的名称:
var strCurrentFieldEditing:String =“”
在表视图的cellForRowAt函数中,添加事件目标以处理每个UITextField单元格的Editing Did Begin。设置每个文本字段以调用不同的函数:
txtFirstName.addTarget(self,action:#selector(self.firstNameEditingDidBegin),for:.editingDidBegin)
txtLastName.addTarget(self,action:#selector(self.lastNameEditingDidBegin),for:.editingDidBegin)
在每个函数中,将字符串设置为正在编辑的文本字段:
@objc func firstNameEditingDidBegin(_ textField:UITextField) { strCurrentFieldEditing =“firstName” }
@objc func lastNameEditingDidBegin(_ textField:UITextField) { strCurrentFieldEditing =“lastName” }
现在,当执行shouldChangeCharactersIn函数时,您可以确定正在编辑的字段:
func textField(_ textField:UITextField,shouldChangeCharactersIn范围:NSRange,replacementString string:String) - &gt;布尔 { 切换strCurrentFieldEditing { case“firstName”: //正在编辑firstName字段... 打破 case“lastName”: //正在编辑lastName字段... 打破 }
那就是所有人。当然,如果你不使用.tag属性,这将是最简单的方法,在我的情况下,我使用.tag属性来做其他事情。如果有人有更好/更简单的方法,请发布您的解决方案。
答案 1 :(得分:0)
您可以在身份检查器>可访问性中为属性accessibilityIdentifier设置名称。
然后您可以使用它来了解您所指的字段:
喜欢这个=>
如果yourTextField.accessibilityIdentifier ==“某物” {
//做点事情
}