UIButton addTarget选择器不起作用

Mur*_*hin 8 uibutton ios swift

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")
  }
}
Run Code Online (Sandbox Code Playgroud)

ViewController.swift

class GameViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let boxRow = SquareBox() 
        boxRow.createBoxes()
    }
}
Run Code Online (Sandbox Code Playgroud)

另外我尝试了@IBAction而不是@objc,它不起作用,但是如果我在创建该对象的ViewController.swift中使用“ click”函数,则该函数可以工作,但是我需要在此类中使用此函数。

rma*_*ddy 12

既然您已经在问题中发布了相关信息,问题就很清楚了。您有内存管理问题。

在您的GameViewController中viewDidLoad,创建的本地实例SquareBox。此本地实例在的末尾超出范围viewDidLoad。由于没有其他对此实例的引用,因此它将在的末尾释放viewDidLoad

由于的实例SquareBox已被释放,因此它不能用作按钮的目标。而且您的click方法永远不会被调用。

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

class GameViewController: UIViewController {
    let boxRow = SquareBox() 

    override func viewDidLoad() {
        super.viewDidLoad()
        boxRow.createBoxes()
    }
}
Run Code Online (Sandbox Code Playgroud)


Amu*_*608 5

 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                       
}
Run Code Online (Sandbox Code Playgroud)


Far*_*ruk 5

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

如果你构建你UIButton

let button: UIButton = {
  return UIButton()
}()
Run Code Online (Sandbox Code Playgroud)

只需将它们转换为

lazy var button: UIButton = {
  return UIButton()
}()
Run Code Online (Sandbox Code Playgroud)

我认为这是因为如上所述有点解除分配。