点击swift 3 iOS时UIButton没有动作

Posted

技术标签:

【中文标题】点击swift 3 iOS时UIButton没有动作【英文标题】:UIButton no action when click swift 3 iOS 【发布时间】:2017-04-12 07:18:25 【问题描述】:

我的自定义 UIButton 有问题。添加目标时,单击时没有执行任何操作。我试图将函数移入 ViewController 类,更改选择器名称和类型,但徒劳无功。 有我的代码。希望您能够帮助我。 (等级制度) CustomButton → MenuButtonGroup → ViewController

import UIKit

class CustomButton: UIButton 

/** vue 1 */
private let view1 = UIImageView()

/** vue 2 */
private let view2 = UIView()

/** couleur du bouton */
private var color = ""

/** décalage y pour le 3d */
private let relief = screenHeight*0.013


init(frame: CGRect, color: String)
    super.init(frame: frame)


    self.color = color
    self.layer.cornerRadius = 10

    //définir la couleur de l'ombre
    switch color 
    case "red":
        self.backgroundColor = shadowRedColor
    case "green":
        self.backgroundColor = shadowGreenColor
    case "blue":
        self.backgroundColor = shadowBlueColor
    case "yellow":
        self.backgroundColor = shadowYellowColor
    default:
        self.backgroundColor = shadowRedColor
    

    mainColorView()

self.addSubview(view2)

    self.addTarget(self, action: #selector(downAction), for: .touchDown)
    self.addTarget(self, action: #selector(touchUp), for: .touchUpInside)
    self.addTarget(self, action: #selector(touchUp), for: .touchUpOutside)



/** vue de couleur principale*/
func mainColorView()

    view2.frame = CGRect(x: 0, y: -relief, width: self.frame.width, height: self.frame.height)
    view2.layer.cornerRadius = 10

    //définir la couleur de l'ombre
    switch color 
    case "red":
        view2.backgroundColor = redColor
    case "green":
        view2.backgroundColor = greenColor
    case "blue":
        view2.backgroundColor = blueColor
    case "yellow":
        view2.backgroundColor = yellowColor
    default:
        view2.backgroundColor = redColor
    


/** appuis sur le bouton */
func downAction(sender: UIButton)
    print("prout")
    UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseOut, animations: 
        self.view2.transform = CGAffineTransform(translationX: 0, y: self.relief)
    )


/**relacher le bouton*/
func touchUp()
    animUp()


/** animer le relachement du bouton*/
func animUp()
    UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.3, options: .curveEaseInOut, animations: 
        self.view2.transform = CGAffineTransform.identity
    )



required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")


将按钮添加到 MenuButtonGroup :

playButton = CustomButton(frame: CGRect(x: 0, y: 0, width: 300, height: 300), color: "green")

按钮显示在屏幕上,但没有任何操作。我试过bringSubviewToFront 但没有效果。

【问题讨论】:

你试过addTarget吗? 是的,它在共享代码中。 【参考方案1】:

当您将所谓的view2 添加到您的UIButton 时,您将其设置为与按钮相同的大小:

view2.frame = CGRect(x: 0, y: -relief, width: self.frame.width, height: self.frame.height)

这意味着,view2 覆盖了下方的整个按钮,并吞下了按钮的触摸事件。执行以下操作:

view2.isUserInteractionEnabled = false

生活会很美好。

编辑:

查看您的项目后,很明显,您正在将此按钮添加到 UIImageView 作为子视图。问题还是一样的,默认情况下UIImageViewisUserInteractionEnabled设置为false

因此,请确保在 MenuButtonGroup 的初始化程序中将其设置为 true

self.isUserInteractionEnabled = true

因此,请禁用 UIView 实例的用户交互,并启用 UIImageView 子类的用户交互。

生活会更美好。

【讨论】:

我想说它有效,但即使我没有将 view2 添加到我的视图和/或 isUserInteractionEnabled = false,该操作也不会发生 你能试试下载我的项目吗?可能是错误在其他文件中,只有 5 个小文件:(500ko) http://we.tl/rMCasf0f8e 当我将我的 CustomButton 添加到 ViewController 视图时,它就可以工作了。但是我的 CustomButton 在一个视图中,它被添加到 ViewController。我尝试将 isUserInteractionEnabled 添加到它,但仍然无法正常工作。但是感谢我们的进步! 非常感谢!我现在知道了。你救了我^^【参考方案2】:

您分配的操作不正确。

您的操作声明是func downAction(sender: UIButton),但是您要添加func downAction()。您需要像这样添加它:

self.addTarget(self, action: #selector(downAction(sender:)), for: .touchDown)

【讨论】:

@MatthieuBravo 可能 view2 阻止了触摸。尝试为其添加操作。 view2.addTarget(self, action: #selector(downAction(sender:)), for: .touchDown). 仍然没有反应。我看不出问题出在哪里。 @MatthieuBravo 并分配了正确的操作。您的布局有问题 - 只有左上四分之一的按钮响应触摸。尝试点击左上角。 @MaxPevser 有了你的答案并点击左上角,我看不到任何动作。 view2 = UIButton, addTarget to view2, addTarget to CustomButton. @MaxPevser 你能下载我的项目(500ko)吗? http://we.tl/rMCasf0f8e【参考方案3】:

尝试改变这一点:

init(frame: CGRect, color: String) 
    super.init(frame: frame)

    self.color = color
    self.layer.cornerRadius = 10

    //définir la couleur de l'ombre
    switch color 
    case "red":
        self.backgroundColor = shadowRedColor
    case "green":
        self.backgroundColor = shadowGreenColor
    case "blue":
        self.backgroundColor = shadowBlueColor
    case "yellow":
        self.backgroundColor = shadowYellowColor
    default:
        self.backgroundColor = shadowRedColor
        

    mainColorView()

    self.addSubview(view2)

    self.addTarget(self, action: #selector(downAction), for: .touchDown)
    self.addTarget(self, action: #selector(touchUp), for: .touchUpInside)
    self.addTarget(self, action: #selector(touchUp), for: .touchUpOutside)

到这里:

init(frame: CGRect, color: String) 
    super.init(frame: frame)

    self.color = color
    self.layer.cornerRadius = 10

    //définir la couleur de l'ombre
    switch color 
        case "red":
             self.backgroundColor = shadowRedColor
        case "green":
             self.backgroundColor = shadowGreenColor
        case "blue":
             self.backgroundColor = shadowBlueColor
        case "yellow":
             self.backgroundColor = shadowYellowColor
        default:
             self.backgroundColor = shadowRedColor
    

    mainColorView()

    self.view2.addTarget(self, action: #selector(CustomButton.downAction), for: .touchDown)
    self.view2.addTarget(self, action: #selector(CustomButton.touchUp), for: .touchUpInside)
    self.view2.addTarget(self, action: #selector(CustomButton.touchUp), for: .touchUpOutside)

    self.addSubview(view2)

编辑: 尝试从函数定义中删除发件人:UIButton:

func downAction() 
    print("prout")
    UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseOut, animations: 
        self.view2.transform = CGAffineTransform(translationX: 0, y: self.relief)
    )

EDIT2: 尝试将 view2 类型从 UIView() 更改为 UIButton()

【讨论】:

@MatthieuBravo 你确定你现在在添加目标后添加子视图吗? 没有变化,仍然没有反应。 是的,我确定,没有操作。 @MatthieuBravo 检查更新 没有任何变化

以上是关于点击swift 3 iOS时UIButton没有动作的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中突出显示(或点击)按钮时如何更改 UIButton 边框颜色?

添加 UIButton 目标时“类名没有成员函数名”

当一个 UIButton 被点击时,你如何让它变大,然后使用 Swift 3 回到以前/正常的大小?

swift 在UIButton上展示动图

使用 Swift 3 为 iOS 中的 UIButton 设置“背景颜色”动画

Swift 2 - 使用 UIButton 进行简单导航