Swift4中UIButton的addTarget在UIView中失效问题咨询
问题排查与解决方案
我来帮你搞定这个addTarget失效的问题!你遇到的情况,大概率是因为你的ViewSystem子视图本身没被正确加入视图层级,或者交互属性出了问题。咱们一步步拆解:
可能的原因&修复方案
1. ViewSystem根本没被添加到主视图
你创建了ViewSystem,但如果没执行self.view.addSubview(ViewSystem),这个视图就不在屏幕的视图树里——它里面的按钮自然也接收不到任何点击事件,哪怕你给按钮设了frame也没用。
2. ViewSystem的交互被禁用了
UIView默认isUserInteractionEnabled是true,但如果不小心把它改成false,它的所有子视图(包括你的按钮)都会失去交互能力,点击事件根本传不下去。
3. 代码里的语法遗漏或错误
看你贴的代码片段,有几个细节要注意:
TestPressed方法里的Test应该是某个UILabel吧?建议用空合运算符避免可选值崩溃,比如Test.text = String(sender?.tag ?? 0)- 你在
ButtonCreate里有没有给按钮绑定addTarget?有没有把按钮添加到ViewSystem里?这两步缺一不可。
修正后的完整示例代码
class ViewController: UIViewController { // Swift命名规范:变量名小写开头 var viewSystem = UIView() // 假设你需要一个显示标签的UILabel var testLabel = UILabel() override func viewDidLoad() { super.viewDidLoad() // 先把viewSystem加到主视图 setupViewSystem() // 创建并添加按钮 createTestButton() // 设置显示用的Label setupTestLabel() } func setupViewSystem() { viewSystem.frame = self.view.bounds // 让它铺满主视图,可按需调整 viewSystem.backgroundColor = .lightGray // 方便观察视图范围 self.view.addSubview(viewSystem) // 显式开启交互(默认是true,避免意外被修改) viewSystem.isUserInteractionEnabled = true } func setupTestLabel() { testLabel.frame = CGRect(x: 50, y: 50, width: 200, height: 50) testLabel.backgroundColor = .white self.view.addSubview(testLabel) } @objc func testPressed(sender: UIButton?) { testLabel.text = String(sender?.tag ?? 0) } func createTestButton() { let button = UIButton(type: .system) button.frame = CGRect(x: 50, y: 150, width: 150, height: 50) button.setTitle("点击测试", for: .normal) button.tag = 100 // 绑定点击事件 button.addTarget(self, action: #selector(testPressed(sender:)), for: .touchUpInside) // 把按钮添加到viewSystem viewSystem.addSubview(button) } }
核心逻辑就是:确保父视图ViewSystem在主视图层级里、交互开启,同时按钮的事件绑定和父视图添加步骤都没遗漏。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

