ios - 具有协议(protocol)问题的 Swift 通用 UIView 子类

标签 ios generics swift uiview uigesturerecognizer

我扩展了 UIView 以符合 UIGestureRecognizerDelegate 协议(protocol)

下面的代码可以编译

let label = UILabel()
let recognizer = UITapGestureRecognizer(target: label.self, action: Selector("tapGestureHandler:"))
recognizer.delegate = label.self
label.addGestureRecognizer(recognizer)

现在我正在尝试创建一个通用子类来创建不同的 UIView 子类

class MyView<T:UIView> {
    init() {
        (T.self as T.Type).init(frame: CGRectZero)
    }

    func addGestureToView() {
        let recognizer = UITapGestureRecognizer(target: T.self, action: Selector("tapGestureHandler:"))
        // The below two lines produces syntax error    
        recognizer.delegate = T.self // does not conform to protocol 'UIGestureRecognizerDelegate'
        T.addGestureRecognizer(recognizer) // UITapGestureRecognizer cannot convertible to UIView
    }
}

对我来说奇怪的是,T.addGestureRecognizer 需要 UIView 而不是 UIGestureRecognizer

更新:

我希望 MyView 的返回类型是 UIView 的子类,

let view = MyView<UIView>()

//我想这样用

view.tintColor = UIColor.redColor() // I can't

//但是,我必须用这种方式

view.subview.tintColor = UIColor.redColor()

最佳答案

T 是您的 subview 的类型。您必须创建它的实例以调用 addGestureRecognizer 并将其设置为手势识别器的委托(delegate)。

class MyView<T:UIView where T: UIGestureRecognizerDelegate> {
    var subview: T

    init() {
        subview = T(frame: CGRectZero)
    }

    func addGestureToView() {
        let recognizer = UITapGestureRecognizer(target: subview, action: Selector("tapGestureHandler:"))

        recognizer.delegate = subview
        subview.addGestureRecognizer(recognizer)
    }
}

请注意,您假设传递给创建 MyView 实例的类有一个名为 tapGestureHandler: 的方法。您可能应该将此方法添加到协议(protocol)中,并使 T 也符合它。

关于ios - 具有协议(protocol)问题的 Swift 通用 UIView 子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28258850/

相关文章:

android - 如何在触摸时删除克隆

ios - iOS 13.4访问MPMusicPlayerController.systemMusicPlayer使应用程序崩溃

Java 泛型方法基础知识(反射)

generics - Scala 的 implicit 可以组合成转换更高种类的类型吗?

ios - 本地notifications是否可以swift从web上下载信息

ios - UIImageview 没有变圆

ios - ZBar 二维码库不能在 IOS 上运行

java - 查找泛型数组中的最大元素及其位置,并返回包含两者的数组

swift - swift 中的 `if var` 和 `if let` 有什么区别?

swift - 在 tableviewcell 上覆盖按钮,里面有 collectionview