扩展 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 事件的委托的主要内容,如果未能解决你的问题,请参考以下文章
Django:jQuery触发表单提交onchange of checkbox并保留重新加载时的值
当用js动态的改变一个输入框中的值后,并不能触发它的onchange事件why?