【问题标题】:Create max character length in UITextField using IBInspectable [duplicate]使用 IBInspectable 在 UITextField 中创建最大字符长度 [重复]
【发布时间】:2020-06-03 04:30:24
【问题描述】:

我想用IBInspectable 为我的文本字段创建一个最大长度,我在here 问题上看到了这个问题的答案,但我收到了一个错误提示Expression type '()' is ambiguous without more context

我的代码是

import UIKit

private var __maxLengths = [UITextField: Int]()
extension UITextField {
    @IBInspectable var maxLength: Int {
        get {
            guard let l = __maxLengths[self] else {
               return 150 // (global default-limit. or just, Int.max)
            }
            return l
        }
        set {
            __maxLengths[self] = newValue
            addTarget(self, action: #selector(fix), for: .editingChanged)
        }
    }
    @objc func fix(textField: UITextField) {
        let t = textField.text
        textField.text = t?.prefix(maxLength)
    }
}

我收到指向 textField.text = t?.prefix(maxLength) 的错误消息,并显示 Expression type '()' is ambiguous without more context

我该如何解决?

【问题讨论】:

  • 你能去掉func fix前面的@objc注解吗?我认为它会导致此错误。
  • @Sung-JongWillKim @objc 是必填项
  • 哦,选择器已链接。

标签: swift uitextfield maxlength ibinspectable


【解决方案1】:

在 Swift 5 中,String 的 prefix 方法返回一个 String.SubSequence 类型的值

func prefix(_ maxLength: Int) -> Substring

您需要将其转换为 String 类型。

一种方法可能是:

let s = textField.text!.prefix(maxLength) // though UITextField.text is defined as an optional String, can be safely force-unwrapped as the default value is an empty string even when set to nil
textField.text = String(s)

或者如果您更喜欢单行解决方案:

textField.text = String(textField.text!.prefix(maxLength))

【讨论】:

  • UITextField text 属性默认值为空字符串。保持t 可选是没有意义的
  • UITextField.text 被定义为可选字符串。我只是与 OP 的原始代码保持一致。打开 var 文本:字符串? // 默认为零
  • UITextField text 属性值永远不会为零
  • 感谢您让我诚实。 “跳转到定义”操作揭示了 UITextField 代码中似乎过时的注释。我会编辑答案
猜你喜欢
  • 2018-03-12
  • 2010-09-30
  • 2015-09-30
  • 2014-10-03
  • 2018-09-11
  • 2011-02-01
  • 1970-01-01
相关资源
最近更新 更多