UIButton没有触发其目标选择器

时间:2018-03-15 01:25:57

标签: ios swift

我有一个UIButton,我放在一个不同于它声明的UIView但是我希望目标选择器在UIView中我声明了按钮。由于按钮正在调用init_button函数放在视图上。这就是我所拥有的:

import Foundation
import UIKit

class Menu1 : Element {

var color_base = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)

var mock : UIView = UIView()
var button : UIButton = UIButton()
var view_width: CGFloat = 0,
    view_height: CGFloat = 0,
    menu_vertical_buffer : CGFloat = 0,
    menu_width : CGFloat = 0,
    button_vertical_buffer : CGFloat = 0,
    button_width : CGFloat = 0


required init(mock: UIView) {
    super.init(mock: mock)
    self.mock = mock
    init_dims()
    init_button()
}

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

func init_dims(){
    view_width = mock.frame.width
    view_height = mock.frame.height
    menu_vertical_buffer = CGFloat(floor(Double(view_height/17.5)))
    menu_width = CGFloat(floor(Double(view_width/2.67)))
    button_vertical_buffer = CGFloat(floor(Double(menu_vertical_buffer/3.6)))
    button_width = menu_width - CGFloat(floor(Double(menu_width/7)))
}

func init_button(){
    button = UIButton(frame: CGRect(x: mock.frame.width - menu_width,
                                    y: mock.frame.height - (menu_vertical_buffer + (2 * button_vertical_buffer)),
                                    width: button_width,
                                    height: menu_vertical_buffer))
    button.backgroundColor = color_base
    button.layer.cornerRadius = button.frame.height/2
    button.addTarget(self, action: #selector(changeMenuState), for: .touchUpInside)
    mock.addSubview(button)
}

dynamic func changeMenuState(){
    print("Menu state changed")
}




}

changeMenuState是我作为目标选择器添加的函数,但按钮位于视图mock中,而不是在这些函数所在的视图中。

5 个答案:

答案 0 :(得分:0)

changeMenuState必须是动态的,或@objc暴露为

@objc func changeMenuState(){
    print("Menu state changed")
}

答案 1 :(得分:0)

我最好的猜测是这可能是一个范围问题。您没有显示按钮的存储位置或范围的生命周期。在典型的场景中,您将在viewcontroller(或可能是单元格)中定义一个按钮,如下所示:

class MyViewController: UIViewController {
    var button: UIButton? = nil 

    override func viewDidLoad() {
        super.viewDidLoad()
        init_button()
    }
}

这样,只要视图控制器在范围内,按钮就会保持在范围内。您的代码看起来有效,所以我的“最佳猜测”是对按钮的引用超出了范围。

您可能需要更深入地了解这些视图如何协同工作以及它们的生命周期范围(如果此评论对您没有帮助)。

答案 2 :(得分:0)

你是否正确设置了按钮的框架?你可以将mock的clipToBounds设置为YES,然后观察。

更新: enter image description here 正如@Badhan Ganesh评论,你可以看到视图堆栈。

答案 3 :(得分:0)

您编写的代码是正确的,我已尝试过相同的代码。我发现的问题是你的按钮出现在屏幕上但是超出了模拟视图的界限,因此按钮无法接收到触摸事件。尝试通过正确设置框架将按钮放在模拟视图边界内。

答案 4 :(得分:0)

我能够解决问题,这是一个范围问题。我从来没有将Menu1类添加到模拟类或任何其他视图中,因此我相信在实例化并放置按钮后,该实例被杀死,因此按钮被放置但目标位于不再使用的类中。什么解决了我的问题是将mock.addSubview(self)添加到此类。