UIButton addTarget Selector无法正常工作

时间:2017-07-18 05:11:08

标签: ios swift uibutton

SquareBox.swift

class SquareBox {
  func createBoxes() {
    for _ in 0..<xy {
            let button = UIButton()

            button.backgroundColor = .white
            button.setTitleColor(UIColor.black, for: .normal)
            button.layer.borderWidth = 0.5
            button.layer.borderColor = UIColor.black.cgColor
            stack.addArrangedSubview(button)
            button.addTarget(self, action: #selector(click(sender:)) , for: .touchUpInside)
    }
  }

  @objc func click(sender : UIButton) {
    print("Click")
  }
}

ViewController.swift

class GameViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let boxRow = SquareBox() 
        boxRow.createBoxes()
    }
}

我也试过@IBAction而不是@objc,它不起作用,但是如果我在ViewController.swift中使用“click”函数我创建了这个对象,它正在工作但是我需要这个类里面的这个函数

7 个答案:

答案 0 :(得分:6)

现在您已在问题中发布了相关信息,问题非常清楚。您有内存管理问题。

在GameViewController的viewDidLoad中,您可以创建SquareBox的本地实例。此本地实例超出viewDidLoad末尾的范围。由于没有对此实例的其他引用,因此会在viewDidLoad的末尾取消分配。

由于SquareBox的实例已被解除分配,因此不能充当按钮的目标。并且永远不会调用您的click方法。

解决方案是在视图控制器中保留一个引用:

class GameViewController: UIViewController {
    let boxRow = SquareBox() 

    override func viewDidLoad() {
        super.viewDidLoad()
        boxRow.createBoxes()
    }
}

答案 1 :(得分:4)

 var btnfirst:UIButton!
 override func viewDidLoad() 
 {
    super.viewDidLoad()
    btnfirst = UIButton(type: .system)
    btnfirst.setTitle("Press", for: .normal)
    btnfirst.setTitleColor(.red, for: .normal)
    btnfirst.frame = CGRect(x: 100, y: 200, width: 100, height: 30)
    btnfirst.addTarget(self, action: #selector(benpress( sender:)),for: .touchUpInside)
    self.view.addSubview(btnfirst)
}

func benpress( sender :UIButton) 
{
  //Your Code Here                       
}

答案 2 :(得分:2)

对于那些没有找到解决方案的人,这是我的。

如果您将 UIButton 构建为

let button: UIButton = {
  return UIButton()
}()

只需将它们转换为

lazy var button: UIButton = {
  return UIButton()
}()

我认为这是因为如上所述的某种程度的解除分配。

答案 3 :(得分:0)

button.addTarget(self, action:#selector(self.click), for: .touchUpInside)

func click(sender : UIButton) {
       // code here
    }

答案 4 :(得分:0)

我想问题是如何设置按钮的布局。 试试这个:

func createBoxes() {
    stack.backgroundColor = UIColor.red
    for _ in 0..<xy {
        // Create the button
        let button = UIButton()
        button.backgroundColor = UIColor.red

        // Add constraints
        button.translatesAutoresizingMaskIntoConstraints = false
        button.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
        button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true

        // Setup the button action
        button.addTarget(self, action: #selector(SquareBox.click(sender:)), for: .touchUpInside)

        // Add the button to the stack
        stack.addArrangedSubview(button)
    }
}

@objc func click(sender : UIButton) {
    print("Click")
}

答案 5 :(得分:-1)

替换为:

    btn.addTarget(self, action: #selector(self.click(sender:)), for: .touchUpInside)

enter image description here

我认为对你的选择器方法有其他影响,试着在你的代码中查找,因为你的代码也在我的项目中工作。

enter image description here

答案 6 :(得分:-1)

button.addTarget(self, action: #selector(self.buttonTapped), for: .touchUpInside)

func buttonTapped(sender : UIButton) {
       // code here
    }