如何在UITextField扩展中创建新字段?

时间:2016-12-23 10:11:15

标签: ios swift

我是Swift的新手,也许这是一个愚蠢的问题,但我无法找到答案。

我创建了一个扩展程序:

extension UITextField {

  var placeholderLabel: UILabel {

    get {
      return self.placeholderLabel
    }

    set {
      self.placeholderLabel = newValue
    }

  }

}

设置属性后,应用程序崩溃。

2 个答案:

答案 0 :(得分:2)

您无法在扩展程序中拥有存储的属性。

不允许扩展将属性添加到现有类,因为添加类的属性结构将会更改。而且由于Objective C,Swift或任何其他编程语言都无法承受,因此它不允许您将存储的属性添加到扩展中。

那时还有什么工作吗?

您可以执行以下操作:将标签保存为扩展程序中的存储属性:)

import Foundation
import UIKit


fileprivate var ascociatedObjectPointer : UInt8 = 99

extension UITextField {
    var myLabel : UILabel {
        get {
            return objc_getAssociatedObject(self, &ascociatedObjectPointer) as! UILabel
        }
        set {
            objc_setAssociatedObject(self, &ascociatedObjectPointer, myLabel, .OBJC_ASSOCIATION_RETAIN)
        }
    }
}

如何运作?

通过为您正在构成或假装存储属性的变量编写setter和getter,并通过内部保存与现有类无关的指针,简单,因此它不会影响现有结构类。

希望它有所帮助。

答案 1 :(得分:0)

您可以像这样使用NSMapTable

extension UITextField {

  private static var placeholderLabelMap: NSMapTable<UITextField, UILabel> = .weakToStrongObjects()
  
  var placeholderLabel: UILabel? {
    get {
      return UITextField.placeholderLabelMap.object(forKey: self)
    }
    set {
      UITextField.placeholderLabelMap.setObject(newValue, forKey: self)
    }
  }

}

Sandeep的答案的优点可能是线程安全。您可以查看this堆栈溢出主题,以比较两种方法。