如何调用带有关闭功能的点击手势(iOS)

时间:2019-04-15 08:54:41

标签: ios swift xcode

我有一个带有插座的自定义UIView。现在要设置标题和图像,我做了一个在视图控制器中调用的函数,但是当用户点击自定义UIView时,我要为此目的执行一些操作是使用点击手势。所以我做了一个闭合以使用点击手势,并将其作为函数中的最后一个参数传递,但是我不知道如何使用闭合来调用点击手势 很抱歉,如果这个傻子只是需要一点帮助,就在这里

我的IBOutlets

@IBOutlet weak var containerView: UIView!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var toggle: UISwitch!

我的关闭和点击手势

// Closure
 var onClickView: (() -> Void)?

// Tap gesture
 let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.onClickGestureRecognizerView))
    self.containerView.addGestureRecognizer(tap)

@objc func onClickGestureRecognizerView() {
    if let onClickView = onClickView {
        onClickView()
    }
}

这是我传递标题,图像和此结束符的功能

func setSettingView(title: String, image: UIImage, onClickView: (() -> Void)? = nil) {
    self.title.text = title
    self.imageView.image = image
}

我只想知道当我调用该函数时,如何在分配标题和图像后使用此闭包执行点击动作

我正在做这样的事情

accountInformationSettingView.setSettingView(title: "Account Information", image: #imageLiteral(resourceName: "account")) {
        self.present(AccountInformationViewController.instantiateViewController(), animated: true, completion: nil)

    }

2 个答案:

答案 0 :(得分:2)

分配通过了视图属性的闭包。

func setSettingView(title: String, image: UIImage, onClickView: (() -> Void)? = nil) {
    self.title.text = title
    self.imageView.image = image
    self.onClickView = onClickView
}

现在,当您点击视图时,此闭合将被称为

调用setSettingView方法时,调用如下

let accountInformationSettingView = CustomView()
// setup accountInformationSettingView
let tapClosure = {
    self.present(UIViewController(), animated: true, completion: nil)
}
accountInformationSettingView.setSettingView(title: "Account Information", image: #imageLiteral(resourceName: "account"), onClickView: tapClosure)

setSettingView方法中,tapClosure将在self.onClickView中分配

点击containerView时,将调用onClickGestureRecognizerView容器,并检查self.onClickView是否为空。

然后将tapClosure称为

答案 1 :(得分:0)

好吧,@ RajeshKumar R是正确的,当您说在init方法中调用它时,但实际上,当我们使用nib制作自定义UIView时,有2种方法只在一种方法中调用,所以我在两个函数中均调用了该方法像这样

 private func addGesture() {
    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.onClickGestureRecognizerView))
    self.containerView.addGestureRecognizer(tap)
}



 required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setupFromNib()
    addGesture()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setupFromNib()
    addGesture()
}

这解决了这个问题,非常感谢所有真正意义上的帮助人员