Swift 如何在UIkit类的协议扩展中设置委托
我试图让我的所有TextView实例都使用UITextPasteDelegate中的相同委托函数,而不将委托函数复制到每个VC中 执行此操作时,Xcode 10.3编译器不会抛出错误:Swift 如何在UIkit类的协议扩展中设置委托,swift,xcode,Swift,Xcode,我试图让我的所有TextView实例都使用UITextPasteDelegate中的相同委托函数,而不将委托函数复制到每个VC中 执行此操作时,Xcode 10.3编译器不会抛出错误: extension UITextView : UITextPasteDelegate { private func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: UITextPasteConfiguration
extension UITextView : UITextPasteDelegate {
private func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: UITextPasteConfigurationSupporting, shouldAnimatePasteOf attributedString: NSAttributedString, to textRange: UITextRange) -> Bool {
return false
}
}
然而,我遇到的问题是,当我试图在VC中设置此委托时。代码如下所示:
class viewController : UIViewController{
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.pasteDelegate = self
}
}
它在textView.pasteDelegate=self行中断,我知道它在这里中断是因为viewController类没有实现UITextPasteDelegate。但我的问题是是否可以分配textView.pasteDelegate=?去做点什么。我尝试了textView.pasteDelegate=UITextView.Type,但也失败了
有没有办法做到这一点?扩展无法覆盖方法。这是不受支持的。有时它可能碰巧起作用,但它是未定义的行为
在Swift编程语言中:
扩展可以向类型添加新功能,但不能覆盖现有功能。
(这完全正确,但实际上并不适用于此问题;请参阅下文。)
这正是子类的用途。在Interface Builder中,选择子类,它仍将连接为UITextView。它将按照您想要的方式进行配置。例如:
class NonAnimatingTextView: UITextView {
override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
self.pasteDelegate = self
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
}
extension NonAnimatingTextView: UITextPasteDelegate {
func textPasteConfigurationSupporting(
_ textPasteConfigurationSupporting: UITextPasteConfigurationSupporting,
shouldAnimatePasteOf attributedString: NSAttributedString,
to textRange: UITextRange) -> Bool { false }
}
为了完整性,你想要做的事情实际上是可能的;这不是正确的方法。(在本例中,结果表明它不是覆盖,因此是可能的。) 首先,当该方法应该是公共的时,您将其标记为private,理想情况下,
@objc
(@objc
)这里可能不需要,但我将添加它以非常清楚):
然后UITextView就是它自己的pasteDelegate
:
class ViewController : UIViewController{
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.pasteDelegate = textView
}
}
但是我仍然推荐这个子类。你在做什么就更清楚了。什么是“它断开”意思?你也在说
textView.pasteDelegate
,但是你的代码在哪里说文本视图甚至有pasteDelegate
属性?谢谢你的帮助。这太糟糕了,苹果还没有找到一个办法来做到这一点。我想我得复制很多代码。
class ViewController : UIViewController{
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
textView.pasteDelegate = textView
}
}