Swift4中UIButton点击无响应求助:仅触发动画无控制台输出
问题分析与解决方案
这个问题我之前也碰到过!核心问题出在你初始化按钮的时机和self的生命周期上,咱们来一步步理清楚:
为什么点击没触发方法?
你现在用普通var定义tbutton并通过闭包初始化,这个闭包会在类实例初始化的早期阶段就执行——此时self(也就是你的ViewController实例)还没有完成完整的初始化,所以button.addTarget(self, ...)里的self是一个无效的引用,导致点击事件无法正确传递到你的dothings方法。
按钮能显示动画是因为它已经被正确添加到视图上了,但事件响应链没绑定到正确的对象上,所以控制台没有输出。
两种快速修复方案
方案1:把按钮改成懒加载属性
用lazy var替代普通var,这样初始化闭包会延迟到第一次访问tbutton的时候才执行,此时self已经完全初始化完成,target能正确绑定:
lazy var tbutton: UIButton = { let button = UIButton(type: .system) button.frame = CGRect(x: 40.0, y:400.0, width: 300.0, height: 300.0) let image = UIImage(named: "backb") button.setBackgroundImage(image, for: .normal) button.addTarget(self, action: #selector(dothings), for: .touchUpInside) return button }()
方案2:在viewDidLoad中添加target
如果不想用懒加载,也可以把添加target的逻辑移到viewDidLoad方法里——这个方法是在ViewController初始化完成后调用的,self肯定是有效的:
var tbutton: UIButton = { let button = UIButton(type: .system) button.frame = CGRect(x: 40.0, y:400.0, width: 300.0, height: 300.0) let image = UIImage(named: "backb") button.setBackgroundImage(image, for: .normal) // 这里先不添加target return button }() override func viewDidLoad() { super.viewDidLoad() // 在这里绑定target tbutton.addTarget(self, action: #selector(dothings), for: .touchUpInside) view.addSubview(tbutton) }
选其中一种方案修改后,再点击按钮应该就能看到控制台输出"this is a test"了!
内容的提问来源于stack exchange,提问作者George Constantine
相关产品推荐
相关产品推荐

