我正在尝试获取 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 与导出属性进行比较,因为这些字段是 TableView 的一部分并且是动态创建的。
最佳答案
当我到达 shouldChangeCharactersIn 时,我能够识别 UITextField 的名称。如果有人有更好的方法,请发布它,但这对我来说非常有效。以下是解决该问题的步骤:
创建 View Controller 的全局变量来保存正在编辑的字段的名称:
var strCurrentFieldEditing: String = ""
在 TableView 的 cellForRowAt 函数中,添加事件目标来处理每个 UITextField 单元格的“编辑已开始”。设置每个文本字段调用不同的函数:
txtFirstName.addTarget(self, action:#selector(self.firstNameEditingDidBegin), for: .editingDidBegin)
txtLastName.addTarget(self, action:#selector(self.lastNameEditingDidBegin), for: .editingDidBegin)
在每个函数中,将字符串设置为正在编辑的文本字段:
@objc func firstNameEditingDidBegin(_ textField: UITextField) { strCurrentFieldEditing = "名字" }
@objc func lastNameEditingDidBegin(_ textField: UITextField) { strCurrentFieldEditing = "姓氏" }
现在,当执行shouldChangeCharactersIn函数时,您可以确定正在编辑哪个字段:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 切换 strCurrentFieldEditing { 案例“名字”: //正在编辑名字字段... 休息 案例“姓氏”: //姓氏字段正在编辑... 休息 }
这就是大家。当然,如果您不使用 .tag 属性,那将是最简单的方法,就我而言,我将 .tag 属性用于其他用途。如果有人有更好/更简单的方法来做到这一点,请发布您的解决方案。
关于swift - 获取 Swift 4 中 UITextField 的字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49678723/