首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中重写UIScrollView的委托属性(与UICollectionView一样)

在Swift中重写UIScrollView的委托属性(与UICollectionView一样)
EN

Stack Overflow用户
提问于 2014-09-08 12:50:51
回答 6查看 14.7K关注 0票数 39

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

代码语言:javascript
运行
复制
protocol UIScrollViewDelegate : NSObjectProtocol {
    //...
}
class UIScrollView : UIView, NSCoding {
    unowned(unsafe) var delegate: UIScrollViewDelegate?
    //...
}

UICollectionView用不同类型的UICollectionViewDelegate重写此属性。

代码语言:javascript
运行
复制
protocol UICollectionViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
   //...
}

class UICollectionView : UIScrollView {
     unowned(unsafe) var delegate: UICollectionViewDelegate?
   //...
}

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

代码语言:javascript
运行
复制
protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
    //...
}

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

}

编译器给我两个警告:

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

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

EN

Stack Overflow用户

发布于 2015-05-27 16:11:50

以下是在Swift中更改重写属性类型的解决方案。当您需要扩展委托协议时,它特别有用。

代码语言:javascript
运行
复制
@objc protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate {
     func someNewFunction()
}

class CustomScrollView: UIScrollView {

    weak var delegateInterceptor: ExtendedScrollViewDelegate?
    override var delegate: UIScrollViewDelegate! {
        didSet {
            if let newValue = delegate {
                let castedDelegate = unsafeBitCast(delegate, ExtendedScrollViewDelegate.self)
                delegateInterceptor = castedDelegate
            }
            else {
                delegateInterceptor = nil
            }
        }
    }
}

这与Swift 1.2版本的测试一样有效。希望能帮上忙。

票数 4
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25724709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档