代码之家  ›  专栏  ›  技术社区  ›  Nader

Swift添加目标类

  •  2
  • Nader  · 技术社区  · 6 年前

    我有个班, Listner 以下内容:

    class Listner {
        typealias ListenerType = () -> ()
        var listeners: [ListenerType] = []
    
        init<V: UIControl>(view: V, event: UIControlEvents, listener: @escaping ListenerType) {
            print("Init") // Prints
            view.addTarget(self, action: #selector(actionEvent), for: event)
            self.listeners.append(listener)
        }
    
        @objc private func actionEvent() {
            print("EventChanged") // Does not print
            self.listeners.forEach { (listner) in
                listner()
            }
        }
    }
    

    从一个角度来看 UIControl 并添加一个目标。我知道目标添加成功,因为当我打印 view.allTargets 我可以看到刚刚添加的目标。

    @IBOutlet weak var textField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        Listner(view: textField, event: .editingChanged) {
            print("listen")
        }
    
    }
    

    当我像上面那样调用类并输入文本字段时, actionEvent() 从未打过电话。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Christian Abella    6 年前

    您需要将listner设置为成员变量,这样在调用viewdidload之后它就不会超出范围。如果它是成员变量,则在对控件进行任何编辑时都将调用它。

    class ViewController : UIViewController {
      @IBOutlet weak var textField: UITextField!
      var listner : Listner!
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        self.listner = Listner(view: textField, event: .allEditingEvents) {
            print("listen")
        }
      }
    }