You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 13:39:30