【问题标题】:Get field name of UITextField in Swift 4在 Swift 4 中获取 UITextField 的字段名称
【发布时间】:2018-04-05 18:02:46
【问题描述】:

我正在尝试获取 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 的一部分并且是动态创建的。

【问题讨论】:

  • 这是错误的方法。将 textField 参数与您的文本字段 outlets/properties 进行比较。无需获取名称。
  • rmaddy 感谢您的意见。这些字段是在表格视图中动态创建的。它们没有连接到插座。
  • 如果文本字段是动态的,您将没有每个文本字段的属性。你为什么不完全重写你的问题来解释你需要解决的实际问题,这将是关于知道正在编辑哪个文本字段你会得到更好的帮助,而不是询问对实际问题的错误解决方案的问题。
  • rmaddy,我已经用相关信息更新了问题,说明这些字段是动态创建的。
  • 不,摆脱您发布的代码并用相关的表格视图代码和相关的文本字段委托代码等替换它。解释您的实际基本问题。您无需获取属性名称。这是错误的解决方案。

标签: swift


【解决方案1】:

当我到达 shouldChangeCharactersIn 时,我能够识别 UITextField 的名称。如果有人有更好的方法,请发布它,但这对我来说非常有用。以下是解决问题的步骤:

  1. 为视图控制器创建一个全局变量来保存正在编辑的字段的名称:

    var strCurrentFieldEditing: String = ""

  2. 在表格视图的 cellForRowAt 函数中,添加事件目标以处理每个 UITextField 单元格的 Editing Did Begin。将每个文本字段设置为调用不同的函数:

    txtFirstName.addTarget(self, action:#selector(self.firstNameEditingDidBegin), for: .editingDidBegin)

    txtLastName.addTarget(self, action:#selector(self.lastNameEditingDidBegin), for: .editingDidBegin)

  3. 在每个函数中,将字符串设置为正在编辑的文本字段:

    @objc func firstNameEditingDidBegin(_ textField: UITextField) { strCurrentFieldEditing = "名字" }

    @objc func lastNameEditingDidBegin(_ textField: UITextField) { strCurrentFieldEditing = "姓氏" }

  4. 现在当 shouldChangeCharactersIn 函数执行时,您可以确定正在编辑的字段:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 切换 strCurrentFieldEditing { 案例“名字”: // firstName 字段正在编辑中... 休息 案例“姓氏”: // 正在编辑姓氏字段... 休息 }

这就是所有人。当然,如果您不使用 .tag 属性,那将是最简单的方法,就我而言,我将 .tag 属性用于其他用途。如果有人有更好/更简单的方法来做到这一点,请发布您的解决方案。

【讨论】:

  • 同样,如果您通过展示您实际尝试做的事情来正确更新您的问题,则可以为您提供最佳答案。
  • 我已经更新了问题,问题已经解决。无论如何,谢谢。
【解决方案2】:

您可以在身份检查器> Accessibility 中为属性accessibilityIdentifier 设置名称。

然后你可以用它来知道你所指的领域:

像这样=>

如果 yourTextField.accessibilityIdentifier == "something" {

//做某事

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多