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”函数我创建了这个对象,它正在工作但是我需要这个类里面的这个函数
答案 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)
我认为对你的选择器方法有其他影响,试着在你的代码中查找,因为你的代码也在我的项目中工作。
答案 6 :(得分:-1)
button.addTarget(self, action: #selector(self.buttonTapped), for: .touchUpInside)
func buttonTapped(sender : UIButton) {
// code here
}