点击按钮调用removeFromSuperview后UIView未被删除的问题求助
点击按钮调用removeFromSuperview后UIView未被删除的问题求助
嘿,我一眼就瞅出问题出在哪了!
你现在的代码有个关键bug:每次点击按钮都会重新创建一个全新的UIView实例a。给你拆解下流程就懂了:
- 第一次点击(添加视图):你创建了绿色的
a并加到父视图,方法执行完后这个a没被外部持有,很快就被系统回收了。 - 第二次点击(删除视图):你又新建了一个空的
a,然后调用它的removeFromSuperview()——但这个新a从来没被加到父视图里过,自然看不到删除效果,而之前那个绿色视图还好好待在父视图里呢!
修复方案
把要操作的UIView改成类的成员变量,让它能在多次点击之间被保留,这样每次操作的都是同一个视图实例:
首先在你的ViewController类里添加成员变量:
class YourViewController: UIViewController { // 声明成员变量,用来持久保存要操作的视图 private var customGreenView: UIView? // ... 你的其他代码
然后修改按钮点击的方法:
@objc func action(sender: UIButton) { if settingsButtonState == true { settingsButtonState = false // 操作成员变量,移除之前添加的绿色视图 customGreenView?.removeFromSuperview() // 移除后置空,避免不必要的内存占用 customGreenView = nil print("delete") } else { settingsButtonState = true // 初始化并配置绿色视图 let greenView = UIView() greenView.backgroundColor = .green // 这里建议给视图设置明确的frame或者AutoLayout约束,不然默认是CGRect.zero,你可能看不到视图 greenView.frame = CGRect(x: 50, y: 50, width: 200, height: 200) view.addSubview(greenView) // 把实例保存到成员变量,方便后续删除操作 customGreenView = greenView print("add") } }
另外提个小细节:你原来代码里的view.frame = UIScreen.main.bounds其实没必要,ViewController的view默认就会铺满屏幕,这个设置可以删掉哦。
备注:内容来源于stack exchange,提问作者user25462420
相关产品推荐
相关产品推荐

