用于创建带有按钮的警报的自定义类。如何添加完成处理程序? [英] Custom class to create an Alert with Buttons. How to add a completition handler?

查看:22
本文介绍了用于创建带有按钮的警报的自定义类。如何添加完成处理程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建自定义警报,而我正试图在按钮上实现完成处理程序,这让我抓狂。我尝试了几种方法,最后一种是创建函数数组,以传入UIButton的选择器addTarget函数,但不起作用。(其中*是)

问题:"#selector的参数未引用@OBC方法、属性或初始值设定项"

我不能做的困难的编码部分是用我从我的视图控制器收到的一些代码来配置选择器,在那里我用下面的类创建一个对象。

class Alert: NSObject {

func showAlert(){

    if let window = UIApplication.shared.keyWindow {

        //configure some constraints and animations
}

var buttons: [UIButton] = []
var buttonsFunc: [() -> Void ] = []


func addNewButton(title: String, handler: @escaping () -> Void) {
    buttons.append(createButton(title: title))

    buttonsFunc.append {
        self.dismissAlert()
        handler()
    }
}

func setupButtons() {

    for (index, button) in buttons.enumerated() {
        boxView.addSubview(button)

        //Here is the problem ***************************
        button.addTarget(self, action: #selector(buttonsFunc[index]), for: .touchUpInside)


        //More constraints(not important)
        button.centerXAnchor.constraint(equalTo: boxView.centerXAnchor).isActive = true
        button.widthAnchor.constraint(equalTo: (button.titleLabel?.widthAnchor)!).isActive = true
        button.heightAnchor.constraint(equalToConstant: 25).isActive = true
    }

}

func dismissAlert(){
   //Animation to dismiss my alert
}

其他功能:

//Even if its not important the function i use to create the button

 func createButton(title: String) -> UIButton {
    let button = UIButton(type: .system)
    button.backgroundColor = .clear
    button.setTitle(title, for: .normal)
    button.titleLabel?.sizeToFit()
    button.setTitleColor(uPBlue, for: .normal)
    button.titleLabel?.font = UIFont(name: uPFont, size: 20)
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}

有什么办法解决这个问题吗? 或者可能是一种完全不同的方式。 如果它有效,我就接受它。

推荐答案

所以选择器就是函数的名称。根据定义,闭包是一个匿名函数,因此您不能完全使用这种方法。

让我们尝试另一种方法,定义一个新函数来赋予按钮:

private func buttonPressed(sender: UIButton) {

}

然后,让我们为按钮提供此函数,而不是闭合:

...
button.addTarget(self, action: #selector(Alert.buttonPressed(sender:)), for: .touchUpInside)
...

现在我们可以在这里利用tuples。我们不会有两个单独的数组,而是一个数组,其中包含按钮的特殊数据结构:Actions:

// var buttons: [UIButton] = []
// var buttonsFunc: [() -> Void ] = []
// Becomes
var buttonActionArray: [(button: UIButton, action: () -> Void)] = []

现在让我们实现buttonPressed(sender:)

private func buttonPressed(sender: UIButton) {

   for buttonTuple in buttonActionArray {
      if buttonTuple.button === sender {
         buttonTuple.action()
      }
   }      
}

这篇关于用于创建带有按钮的警报的自定义类。如何添加完成处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆