UIButton 上的 addTarget 不起作用

Posted

技术标签:

【中文标题】UIButton 上的 addTarget 不起作用【英文标题】:addTarget on UIButton not working 【发布时间】:2018-06-08 11:23:53 【问题描述】:

我有一个 UIView 类

class FloatingView  : UIView 
    lazy var floatingButton : UIButton = 
        let button = UIButton(type: UIButtonType.system)
        button.setBackgroundImage(#imageLiteral(resourceName: "ic_add_circle_white_36pt"), for: .normal)
        button.tintColor = UIColor().themePurple()
        button.addTarget(self, action: #selector(buttonClicked), for: UIControlEvents.touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    ()

    override init(frame: CGRect) 
        super.init(frame: frame)
        setupViews()
    

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

    func setupViews() addSubview(floatingButton) 

    override func didMoveToWindow() 
        super.didMoveToWindow()

        floatingButton.rightAnchor.constraint(equalTo: layoutMarginsGuide.rightAnchor).isActive = true
        floatingButton.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor).isActive = true
        floatingButton.widthAnchor.constraint(equalToConstant: 60).isActive = true
        floatingButton.heightAnchor.constraint(equalToConstant: 60).isActive = true
    

    @objc func buttonClicked ()
        print("Clicked..")
    

将此添加到查看者

let floatingButton = FloatingView()
view.addSubview(floatingButton)

我还为浮动视图指定了约束。

按钮已按预期添加到视图中,但单击按钮时未调用“buttonClicked”函数。单击时按钮上的淡入淡出动画虽然有效。我尝试了 UITapGesture 但没有工作。

我已将课程更新如下

class FloatingView
    lazy var floatingButton : UIButton = 
        let button = UIButton(type: UIButtonType.system)
        button.setBackgroundImage(#imageLiteral(resourceName: "ic_add_circle_white_36pt"), for: .normal)
        button.tintColor = UIColor().themePurple()
        button.addTarget(self, action: #selector(buttonClicked(_:)), for: UIControlEvents.touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    ()

    private var view : UIView!

    func add(onview: UIView )
        view = onview
        configureSubViews()
    

    private func configureSubViews()
        view.addSubview(floatingButton)
        floatingButton.rightAnchor.constraint(equalTo: view.layoutMarginsGuide.rightAnchor).isActive = true
        floatingButton.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor).isActive = true
        floatingButton.widthAnchor.constraint(equalToConstant: 60).isActive = true
        floatingButton.heightAnchor.constraint(equalToConstant: 60).isActive = true
    

    @objc func buttonClicked(_ sender : UIButton)
        print("Button Clicked")
    

在控制器中

let flButton = FloatingView()
flButton.add(onview: view)

我正在尝试创建一个浮动操作按钮like this。我不确定我的做法是否正确。

【问题讨论】:

view.layoutMarginsGuide.rightAnchor 中的view 是什么? 您的代码看起来很棒,应该可以工作,那么安全区呢?尝试在 iPhone 6s 上运行它 检查 UI 调试器中的视图层次结构,如果 UIButton 上有任何其他视图。 按钮在哪里添加到视图层次结构中? @sayooj - 我用你的代码在 GitHub 上建立了一个简单的项目,点击按钮会导致“Clicked..”输出到调试控制台。看看 - 看看它是否适合你:github.com/DonMag/SayoojFLoatingButton 【参考方案1】:

尝试将动作更改为

action: #selector(buttonClicked(_:))

和函数

@objc func buttonClicked(_ sender: UIButton)..

【讨论】:

尝试用 action 代替 action 添加一个 tapGestureRecognizer 无需在 buttonClicked @sayooj 中发送发件人,您的代码正在运行 @PPL 尝试使用和不使用发件人【参考方案2】:

我通过将自定义类中的约束设置到其父视图而不是控制器来以某种方式修复它。

func configureSubviews()
    if let superView = superview 
        superView.addSubview(floatingButton)
        widthAnchor.constraint(equalToConstant: circleSpanArea).isActive = true
        heightAnchor.constraint(equalTo: widthAnchor).isActive = true
        centerXAnchor.constraint(equalTo: floatingButton.centerXAnchor).isActive = true
        centerYAnchor.constraint(equalTo: floatingButton.centerYAnchor).isActive = true

        floatingButton.rightAnchor.constraint(equalTo: superView.layoutMarginsGuide.rightAnchor).isActive = true
        floatingButton.bottomAnchor.constraint(equalTo: superView.layoutMarginsGuide.bottomAnchor).isActive = true
        floatingButton.heightAnchor.constraint(equalToConstant: 60).isActive = true
        floatingButton.widthAnchor.constraint(equalToConstant: 60).isActive = true

    

【讨论】:

以上是关于UIButton 上的 addTarget 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义视图的 UIButton - addTarget:action:forControlEvents: 不起作用

在自定义视图中连接到 UIButton 的 AddTarget 不起作用。 (斯威夫特 5,iOS)

UIButton 类参考文档上的 addTarget 方法

在同一个类中调用UIButton AddTarget

UIbutton frame 和 addtarget 不同

UIButton.addTarget 无法正常工作。似乎是一个时间问题?