UIScrollView有一个符合UIScrollViewDelegate的委托属性
protocol UIScrollViewDelegate : NSObjectProtocol {
//...
}
class UIScrollView : UIView, NSCoding {
unowned(unsafe) var delegate: UIScrollViewDelegate?
//...
}UICollectionView用不同类型的UICollectionViewDelegate重写此属性。
protocol UICollectionViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
//...
}
class UICollectionView : UIScrollView {
unowned(unsafe) var delegate: UICollectionViewDelegate?
//...
}当我试图用我的协议覆盖UIScrollViews委托时,如下所示:
protocol MyScrollViewDelegate : UIScrollViewDelegate, NSObjectProtocol {
//...
}
class MyScrollView: UIScrollView {
unowned(unsafe) var delegate: MyScrollViewDelegate?
}编译器给我两个警告:
如何子类UIScrollView和覆盖类型的委托属性(即使用自定义委托协议)?
发布于 2014-09-08 15:07:02
我认为重写继承的属性在Objective中是可能的,但在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 }
}
}这样,任何调用滚动视图委托的方法通常仍然有效,您可以在self.myDelegate上调用特定的委托方法,如下所示:
if let height = self.myDelegate?.myHeight() {
// ...
}发布于 2016-09-07 03:53:52
你可以这样做:
protocol ExtendedUIScrollViewDelegate: UIScrollViewDelegate {
func someNewFunction()
}
class CustomScrollView: UIScrollView {
weak var myDelegate: ExtendedScrollViewDelegate?
override weak var delegate: UIScrollViewDelegate? {
didSet {
myDelegate = delegate as? ExtendedScrollViewDelegate
}
}
}希望这能有所帮助
发布于 2014-09-28 08:30:47
我个人最喜欢的方法不是直接子类滚动视图,而是创建一个包含单独滚动视图并充当委托的UIView子类,然后在必要时将该滚动视图的委托消息转发给UIView子类的自己的委托。这还允许在滚动视图定义的区域之外添加自定义控件。与直接子类相比,它可能看起来有点不雅,但它至少可以避免不愉快的黑客攻击。
https://stackoverflow.com/questions/25724709
复制相似问题