ios - 在自定义 UIGestureRecognizer 类中调用 self.init 之前使用的 self

标签 ios swift swift3

在我调用需要传递对自身的引用以供以后使用的构造函数之前,将 UITapGestureRecognizer 子类化并初始化传递给我的便利构造函数的变量的正确方法是什么?

这是我尚未编译的代码:

import Foundation
import UIKit
import UIKit.UIGestureRecognizerSubclass

typealias ActionBlock = (BlockTapGestureRecognizer) -> Void

class BlockTapGestureRecognizer : UITapGestureRecognizer {

    private var handler: ActionBlock?

    convenience init?(handler block: @escaping ActionBlock) {
        self.init(target:self, action:#selector(self.performAction(_:)))
        self.handler = block
    }

    func performAction(_ recognizer: BlockTapGestureRecognizer) {
        if let block = self.handler {
            block(self)
        }
    }

}

最佳答案

问题是 selfself.performAction(_:) 都在调用 self.init 之前被引用制成。这违反了 Swift 中的初始化顺序要求。

一个解决方案是延迟目标和行动的设定。

convenience init?(handler block: @escaping ActionBlock) {
    super.init()
    addTarget(self, action:#selector(performAction))
    self.handler = block
}

请注意,如果您的 BlockTapGestureRecognizer 实际上没有明确声明的任何其他 init 方法,则此 init 方法不能是一个便利,它不应该是可选的,因为它不会失败:

init(handler block: @escaping ActionBlock) {
    super.init()
    addTarget(self, action:#selector(performAction))
    self.handler = block
}

关于ios - 在自定义 UIGestureRecognizer 类中调用 self.init 之前使用的 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43308833/

相关文章:

ios - 如何使用 Alamofire 4 session 管理器?

ios - 快速从 UIImage/CGImage 获取像素数据作为数组

objective-c - 如何在基于页面的应用程序中禁用 View 中的页面滑动

iphone - 计算 NSMutableArray 中有多少个唯一行

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

swift - 将数据扩展转换为 Swift 3.1 和 UnsafeRawPointer 时遇到问题

ios - 如何在 iOS 10 中使用 TouchID

objective-c - Obj-c/ cocoa touch : Have UITableViewCell - CellTextField only accept Numeric chars?

iOS swift : autoresize collection view nested inside a table view cell

ios - TableViewCell 未完全显示