【问题标题】:UIButton addTarget doesn't get calledUIButton addTarget 没有被调用
【发布时间】:2020-07-22 13:56:25
【问题描述】:

我正在尝试创建一个内部有 UITextFieldUIAlertController
文本字段的右侧应该有一个按钮(使用rightView 属性)。该按钮应查看图像而不是常规文本按钮。

当我单击文本字段的按钮时,应该调用函数 btnClicked,但它实际上从未被调用。

let alert = UIAlertController(title: "Testing", message: "", preferredStyle: .alert)
            
alert.addTextField { (field) in
    let chk = UIButton(type: UIButtonType.custom)
    chk.frame = CGRect(x: 2, y: 2, width: 18, height: 18)
    chk.tag = i
    chk.isUserInteractionEnabled = true
    chk.addTarget(self, action: #selector(self.btnClicked(sender:)), for: .touchUpInside)
    // I also tried the following:
    // chk.addTarget(chk, action: #selector(self.btnClicked(sender:)), for: .touchUpInside)

                    
    chk.setImage(UIImage(named: "rectangle"), for: .normal)
    chk.setImage(UIImage(named: "rectangle"), for: .selected)
    chk.setImage(UIImage(named: "rectangle"), for: .highlighted)
    chk.imageView!.contentMode = UIViewContentMode.scaleAspectFit
    chk.adjustsImageWhenHighlighted = true
                    
    field.rightView = chk
    field.rightViewMode = .always
}
            
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
            
self.present(alert, animated: true, completion: nil)

这是btnClicked 函数:

@objc func btnClicked(sender: UIButton) {
    print("test")
}

目前,我只是尝试打印test,看看它是否有效,但没有任何东西打印到控制台。
难道我做错了什么?到目前为止,单击chk 按钮后,我无法调用btnClicked 函数。

【问题讨论】:

  • 按下按钮时是否会突出显示?我认为警报控制器甚至不会将触摸事件传递给它。
  • 当我按下该按钮时,它不会突出显示。你知道如何让警报控制器传递触摸事件吗?
  • 我已经运行了你的代码,有一些编译器错误,我已经修复了它们。它完美地工作。每次我点击按钮时,它都会在控制台中打印“测试”。
  • 你是如何解决这个错误的?你对代码做了什么改动?
  • 编译错误与Swift版本有关。默认代码也可以。

标签: swift uibutton uialertcontroller addtarget


【解决方案1】:

我已经运行了你的代码,有一些编译器错误,我已经修复了它们。它完美地工作。每次我点击按钮时,它都会在控制台中打印“测试”。

 func showAlert(){
   let alert = UIAlertController(title: "Testing", message: "", preferredStyle: .alert)

    alert.addTextField { (field) in
        let chk = UIButton(type: UIButton.ButtonType.custom)
        chk.frame = CGRect(x: 2, y: 2, width: 18, height: 18)
        chk.tag = 1
        chk.isUserInteractionEnabled = true
        chk.addTarget(self, action: #selector(self.btnClicked(sender:)), for: .touchUpInside)
        // I also tried the following:
        // chk.addTarget(chk, action: #selector(self.btnClicked(sender:)), for: .touchUpInside)


        chk.setImage(UIImage(named: "rectangle"), for: .normal)
        chk.setImage(UIImage(named: "rectangle"), for: .selected)
        chk.setImage(UIImage(named: "rectangle"), for: .highlighted)
        chk.imageView!.contentMode = UIView.ContentMode.scaleAspectFit
        chk.adjustsImageWhenHighlighted = true

        field.rightView = chk
        field.rightViewMode = .always
    }

    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

    self.present(alert, animated: true, completion: nil)
}

@objc func btnClicked(sender: UIButton) {
    print("test")
}

【讨论】:

    【解决方案2】:

    将目标 chk 更改为 self(或您的 btnClicked 函数所在的位置)

    chk.addTarget(self, action: #selector(self.btnClicked(sender:)), for: .touchUpInside)
    

    【讨论】:

    • 我试过了,效果很好。 (按钮不可见,点击文本框右侧)
    • 我刚刚尝试运行它,但它对我不起作用。顺便说一句,按钮不是不可见的
    • 顺便说一句,如果你设置chk.addTarget(chk,.. 它应该会崩溃。你确定可以按下按钮吗?
    • 我按下它,但没有任何反应。它只是保持原样。我猜触摸事件只是没有发生
    • btnClicked 位于何处,您在何处显示警报?
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2018-07-07
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多