Swift 如何在UIkit类的协议扩展中设置委托

Swift 如何在UIkit类的协议扩展中设置委托,swift,xcode,Swift,Xcode,我试图让我的所有TextView实例都使用UITextPasteDelegate中的相同委托函数,而不将委托函数复制到每个VC中 执行此操作时,Xcode 10.3编译器不会抛出错误: extension UITextView : UITextPasteDelegate { private func textPasteConfigurationSupporting(_ textPasteConfigurationSupporting: UITextPasteConfiguration

我试图让我的所有TextView实例都使用UITextPasteDelegate中的相同委托函数,而不将委托函数复制到每个VC中

执行此操作时,Xcode 10.3编译器不会抛出错误:

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
    }
}