首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-09-08 15:07:02

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

代码语言:javascript
运行
复制
@objc protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
    func myHeight() -> CGFloat
    // ...
}

class MyScrollView: UIScrollView {
    var myDelegate: MyScrollViewDelegate? {
        get { return self.delegate as? MyScrollViewDelegate }
        set { self.delegate = newValue }
    }
}

这样,任何调用滚动视图委托的方法通常仍然有效,您可以在self.myDelegate上调用特定的委托方法,如下所示:

代码语言:javascript
运行
复制
if let height = self.myDelegate?.myHeight() {
    // ...
}
票数 20
EN

Stack Overflow用户

发布于 2016-09-07 03:53:52

你可以这样做:

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

class CustomScrollView: UIScrollView {

    weak var myDelegate: ExtendedScrollViewDelegate?
    override weak var delegate: UIScrollViewDelegate? {
        didSet {
            myDelegate = delegate as? ExtendedScrollViewDelegate
        }
    }
}

希望这能有所帮助

票数 7
EN

Stack Overflow用户

发布于 2014-09-28 08:30:47

我个人最喜欢的方法不是直接子类滚动视图,而是创建一个包含单独滚动视图并充当委托的UIView子类,然后在必要时将该滚动视图的委托消息转发给UIView子类的自己的委托。这还允许在滚动视图定义的区域之外添加自定义控件。与直接子类相比,它可能看起来有点不雅,但它至少可以避免不愉快的黑客攻击。

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

https://stackoverflow.com/questions/25724709

复制
相关文章

相似问题

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