【问题标题】:UITextField without get property swift 4没有快速获取属性的 UITextField 4
【发布时间】:2018-06-07 15:18:45
【问题描述】:

我有包含 textField 的自定义控件。示例代码如下所示:

@IBDesignable
class MyTextField: UIView {
  private var _text: String?
  private var textField: UITextField?

@IBInspectable var text: String? {
    get {
        return _text
    } set (newValue) {
        guard let txt = newValue else { return }
        self._text = txt
        //updateView()
    }
}

override func awakeFromNib() {
    super.awakeFromNib()
    updateView()
}

override func prepareForInterfaceBuilder() {
    super.prepareForInterfaceBuilder()
    updateView()
}

func updateView() {
    textField = UITextField(frame: CGRect(x: 0, y: 0, width: 97, height: 30))
    self.addSubview(textField!)
    textField!.text = self._text
}}

当我在代码中创建自定义控件的出口时,我可以set 文本属性,但我不能get 它。我究竟做错了什么 ?我是新人,所以我不明白...

编辑:

  1. 将 MyTextField 添加到 Main.storyboard 和标准文本字段
  2. 创建网点@IBOutlet var myTextField: MyTextField!

    标准文本字段

  3. 在对象检查器中设置我的控件的文本属性

  4. 我对故事板的控制正确更新并且“测试文本”可见
  5. 添加一个按钮并创建一个动作出口

    案例 1:工作正常

    @IBAction func click(_ sender: UIButton) { myTextField.text = 标准TextField.text }

    案例 2:不起作用

    @IBAction func click(_ sender: UIButton) { standardTextField.text = myTextField.text }

    在案例 2 之后,在标准文本字段中是我从对象检查器设置的唯一值。如果我更改 myTextField.text 的值,standardTextField 仍会显示来自对象检查器的原始值

【问题讨论】:

  • 不能get是什么意思?调用myTextField.text 不会编译?
  • @NRitH 请看我的编辑

标签: ios swift uitextfield


【解决方案1】:

我在 Xcode 中复制了您的设置。情况 2 确实有效 - 单击按钮时,standardTextField 会显示 MyTextField 的文本。

注意:在 MyTextField 中,我假设您想创建一次 textField,而不是在每次文本更新时都重新创建它。不过,案例 2 在没有这种变化的情况下也能正常工作。

import UIKit

class ViewController: UIViewController {
    @IBOutlet var myTextField: MyTextField!
    @IBOutlet var standardTextField: UITextField!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        button.addTarget(self, action: #selector(click(_:)), for: .touchUpInside)
    }

    @IBAction func click(_ sender: UIButton) {
        // myTextField.text = standardTextField.text // Case 1 works
        standardTextField.text = myTextField.text // Case 2 works
    }
}

MyTextField 控件:

import UIKit

@IBDesignable
class MyTextField: UIView {
    private var _text: String?
    private var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 97, height: 30))

    @IBInspectable var text: String? {
        get {
            return _text
        } set (newValue) {
            guard let txt = newValue else { return }
            self._text = txt
            updateView()
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.addSubview(textField)
        updateView()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        self.addSubview(textField)
        updateView()
    }

    func updateView() {
        textField.text = self._text
    }
}

【讨论】:

  • 谢谢。我仍然不知道我做错了什么。当我根据您的建议“创建一次 textField”进行更改时,出现界面构建器错误:“无法为 ViewController (BYZ-38-t0r) 渲染和更新自动布局状态:代理引发异常”
  • @emerog 检查 console.app 中的错误并阅读日志,它可能会有所帮助。该错误可能有不同的原因。尝试实现所有初始化,如 initFromCoder 等,并确保在每个初始化中调用 updateView()。检查约束中的冲突。如果您在代码中引用约束,请检查它们是否都不为零。如果类 MyTextField 实际上不是从 UITextfield 继承的,请小心命名它。那可能是设计代码的味道。这是一个环绕 UITextfield 的视图。以后您可能会经常被此类名称误导,并且在覆盖某些属性时遇到问题。
  • @TomaszNazarenko 感谢 Tomasz 的建议。我会检查所有这些。但是......我回滚到以前的版本,这个错误仍然存​​在......我讨厌电脑:D
  • 我不喜欢这个错误。这是一个 IB 代理崩溃,而且非常模糊。请记住清理项目并清理构建文件夹(删除派生数据)。我的猜测是,这对您没有帮助,您将不得不进一步回滚;-) 就我而言,我必须这样做。但是,如果你设法解决它,请告诉我如何 :) 我可能会学到一些新东西。
  • @TomaszNazarenko 谢谢,我会努力寻找解决方案 ;) ps pozdrowienia dla Wrocławia;)
【解决方案2】:

getter 不工作的简单解决方案是更改文本属性 来自

@IBInspectable var text: String? {
    get {
        return _text
    } set (newValue) {
        guard let txt = newValue else { return }
        self._text = txt
        updateView()
    }
}

@IBInspectable var text: String? {
    get {
        return textField!.text
    } set (newValue) {
        guard let txt = newValue else { return }
        self._text = txt
        updateView()
    }
}

但我不知道这是否正确...... 这有意义吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多