扩展 UITextView 并触发 onChange 事件的委托

Posted

技术标签:

【中文标题】扩展 UITextView 并触发 onChange 事件的委托【英文标题】:extending UITextView and triggering the delegate for onChange events 【发布时间】:2017-11-03 12:42:17 【问题描述】:

此代码有效并触发:

class ViewControllerDisplay: UIViewController, UITextViewDelegate 
   //.....

  let textView = MyUITextView(frame: CGRect(x:10, y:20, width:270, height:65))
  textView.params["dataname"] = _dataname
  textView.delegate = self
  view.addSubview(textView)

  func textViewDidChange(_ textView: UITextView) 
      print("YAAAA" + textView.text); 
  

但是这不会触发

  func textViewDidChange(_ textView: MyUITextView) 
      print("YAAAA" + textView.text); 
  

这里是MyUITextView 代码

import UIKit
class MyUITextView: UITextView
  var params: Dictionary<String, Any>
  required init?(coder aDecoder: NSCoder) 
      self.params = [:]
      super.init(coder: aDecoder)
  
  init(frame: CGRect) 
      self.params = [:]
      super.init(frame: frame, textContainer: nil)
  

那么如何扩展委托以在委托“onChange”中包含 MyUITextView

【问题讨论】:

【参考方案1】:

方法 textViewDidChange (textView: MyUITextView) 没有被调用,因为在 UITextViewDelegate 协议中该方法被指定为 func textViewDidChange ( textView: UITextView)

如果你需要专门从自定义类MyUITextView中调用,你需要为这个类写一个协议,比如:

protocol MyUITextViewDelegate 
    func myTextViewDidChange(_ textView: MyUITextView)

添加 MyUITextViewDelegate 类型的字段?在 MyUITextView 类中:

var myDelegate: MyUITextViewDelegate?

例如在 ViewControllerDisplay 类的 viewDidLoad 类中初始化:

override func viewDidLoad() 
    super.viewDidLoad()
    ...
    textView.myDelegate = self
    ...

MyUITextView 类需要订阅 UITextViewDelegate 协议并实现 textViewDidChange(_textView:UITextView) 方法,如果存在则从 myDelegate 调用我们的协议:

class MyUITextView: UITextView, UITextViewDelegate 
    ...
    func someInitMethod() 
        delegate = self
    
    ...
    func textViewDidChange(_ textView: UITextView) 
        myDelegate?.myTextViewDidChange(self) 
    

最后,通过在协议 MyUITextViewDelegate 上签署 ViewControllerDisplay 类并实现必要的方法:

class ViewControllerDisplay: UIViewController, MyUITextViewDelegate 
    ...
    func textViewDidChange(_ textView: MyUITextView) 
        print("YAAAA" + textView.text); 
    

【讨论】:

【参考方案2】:

好的,我通过投射想通了

func textViewDidChange(_ textView: UITextView)  
    if let sender = textView as? MyUITextView 
        let dataname = sender.params["dataname"] as? String ?? ""
        print("MyUITextView: dataname" + dataname + " = " + sender.text!)
    

【讨论】:

以上是关于扩展 UITextView 并触发 onChange 事件的委托的主要内容,如果未能解决你的问题,请参考以下文章

修改 Redux 表单值并触发 Onchange

Django:jQuery触发表单提交onchange of checkbox并保留重新加载时的值

p:日历 onselect/onchange 未触发

当用js动态的改变一个输入框中的值后,并不能触发它的onchange事件why?

添加文本和禁用滚动时如何使 UITextView 字段扩展?

iText onchange事件未触发