UIScrollView has a delegate property which conforms to UIScrollViewDelegate
protocol UIScrollViewDelegate : NSObjectProtocol { //... } class UIScrollView : UIView, NSCoding { unowned(unsafe) var delegate: UIScrollViewDelegate? //... }
UICollectionView overrides this property with a different type UICollectionViewDelegate
protocol UICollectionViewDelegate : UIScrollViewDelegate, NSObjectProtocol { //... } class UICollectionView : UIScrollView { unowned(unsafe) var delegate: UICollectionViewDelegate? //... }
When I try to override UIScrollViews delegate with my protocol like so:
protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol { //... } class MyScrollView: UIScrollView { unowned(unsafe) var delegate: MyScrollViewDelegate? }
the compiler gives me two warnings:
How can I subclass UIScrollView and override type of delegate property (i.e. use a custom delegate protocol) ?
I think overriding an inherited property is something that's possible in Objective-C but not (at least currently) in Swift. The way I've handled this is to declare a separate delegate as a computed property of the correct type that gets and sets the actual delegate:
@objc protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol { func myHeight() -> CGFloat // ... } class MyScrollView: UIScrollView { var myDelegate: MyScrollViewDelegate? { get { return self.delegate as? MyScrollViewDelegate } set { self.delegate = newValue } } }
This way anything that calls the scroll view delegate normally still works, and you can call your particular delegate methods on self.myDelegate
, like this:
if let height = self.myDelegate?.myHeight() { // ... }
You can do like this:
protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate { func someNewFunction() } class CustomScrollView: UIScrollView { weak var myDelegate: ExtendedScrollViewDelegate? override weak var delegate: UIScrollViewDelegate? { didSet { myDelegate = delegate as? ExtendedScrollViewDelegate } } }
Hope this helps
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With