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)
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)
对于那些没有找到解决方案的人,这是我的。
如果你构建你UIButton的
let button: UIButton = {
return UIButton()
}()
Run Code Online (Sandbox Code Playgroud)
只需将它们转换为
lazy var button: UIButton = {
return UIButton()
}()
Run Code Online (Sandbox Code Playgroud)
我认为这是因为如上所述有点解除分配。
| 归档时间: |
|
| 查看次数: |
9500 次 |
| 最近记录: |