在Swift中覆盖UIScrollView的委托属性(比如UICollectionView)

str*_*ode 36 uiscrollview uiscrollviewdelegate ios swift

UIScrollView有一个委托属性,符合UIScrollViewDelegate

protocol UIScrollViewDelegate : NSObjectProtocol {
    //...
}
class UIScrollView : UIView, NSCoding {
    unowned(unsafe) var delegate: UIScrollViewDelegate?
    //...
}
Run Code Online (Sandbox Code Playgroud)

UICollectionView使用不同的类型UICollectionViewDelegate覆盖此属性

protocol UICollectionViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
   //...
}

class UICollectionView : UIScrollView {
     unowned(unsafe) var delegate: UICollectionViewDelegate?
   //...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用我的协议覆盖UIScrollViews委托时,如下所示:

protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
    //...
}

class MyScrollView: UIScrollView {
    unowned(unsafe) var delegate: MyScrollViewDelegate?

}
Run Code Online (Sandbox Code Playgroud)

编译器给了我两个警告:

  • 属性'委托'的类型为'MyScrollViewDelegate?' 不能覆盖类型为'UIScrollViewDelegate?'的属性
  • 'unowned'不能应用于非类型'MyScrollViewDelegate?'

我如何子类化UIScrollView并覆盖委托属性的类型(即使用自定义委托协议)?

Nat*_*ook 18

我认为重写一个继承的属性是在Objective-C中可能的,但在Swift中不是(至少目前).我处理这个的方法是声明一个单独的委托作为获取和设置实际委托的正确类型的计算属性:

@objc protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
    func myHeight() -> CGFloat
    // ...
}

class MyScrollView: UIScrollView {
    var myDelegate: MyScrollViewDelegate? {
        get { return self.delegate as? MyScrollViewDelegate }
        set { self.delegate = newValue }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样调用滚动视图委托的任何东西通常都可以工作,你可以调用你的特定委托方法self.myDelegate,如下所示:

if let height = self.myDelegate?.myHeight() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以这样做:

protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate {
    func someNewFunction()
}

class CustomScrollView: UIScrollView {

    weak var myDelegate: ExtendedScrollViewDelegate?
    override weak var delegate: UIScrollViewDelegate? {
        didSet {
            myDelegate = delegate as? ExtendedScrollViewDelegate
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助