【问题标题】:extending UITextView and triggering the delegate for onChange events扩展 UITextView 并触发 onChange 事件的委托
【发布时间】: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

【问题讨论】:

    标签: ios swift uitextview uitextviewdelegate


    【解决方案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!)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2015-03-22
        • 1970-01-01
        相关资源
        最近更新 更多