调用removeFromSuperView()后UITableView仍存在的技术问题求助
UITableView Doesn't Disappear After Calling
removeFromSuperview() 嘿,我来帮你解决这个问题!调用removeFromSuperview()后tableView还没消失,通常是这几个原因导致的,咱们一个个排查:
1. 你操作的是不是正确的tableView实例?
很多时候踩坑是因为重复创建了tableView实例,比如你每次调用setupTableView()都重新初始化tableView = UITableView(...),结果你后来调用移除的是旧的引用,当然没效果。
解决办法:
- 确保tableView是视图控制器的成员变量(不是方法里的局部变量)
- 在移除前先确认它确实在父视图上,再执行移除:
if tableView.superview != nil { tableView.removeFromSuperview() }
另外,建议在setupTableView()开头先移除已存在的tableView,避免重复添加:
func setupTableView() { // 先清掉旧的tableView tableView?.removeFromSuperview() // 再创建新的 tableView = UITableView(frame: CGRect(x: 0, y: 25 + searchBar.frame.size.height, width: view.frame.width, height: view.frame.height - (25 + searchBar.frame.height) - (tabBarController?.tabBar.frame.height ?? 0))) tableView.delegate = self tableView.dataSource = self tableView.register(UITableViewCell.self, forCellReuseIdentifier: "SearchCell") view.addSubview(tableView) }
2. 动画或布局约束在搞鬼
你在searchBarTextDidBeginEditing里用动画修改了tableView的frame,如果之后用了Auto Layout约束,或者动画还没结束就调用移除,可能会导致显示异常。
如果是用Auto Layout布局的tableView,单纯调用removeFromSuperview()还不够,得把对应的约束也删掉;如果是用frame布局,移除前先停止所有动画:
tableView.layer.removeAllAnimations() tableView.removeFromSuperview()
3. 换个思路:用isHidden替代移除操作
如果你的tableView需要频繁显示/隐藏,其实没必要每次都移除再重新添加,直接设置isHidden属性更可靠,还能避免实例引用的问题:
// 隐藏tableView tableView.isHidden = true // 要显示的时候再打开 tableView.isHidden = false
4. 确保在主线程执行UI操作
UI操作必须在主线程执行,如果你的移除代码是在后台API回调里调用的,就会没效果,记得包在主线程里:
DispatchQueue.main.async { self.tableView.removeFromSuperview() }
针对你的场景补充:取消搜索时的处理
看你在搜索开始编辑时显示了tableView,那大概率是点击取消按钮时想移除它?记得实现UISearchBarDelegate的取消按钮点击方法:
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { // 移除或隐藏tableView tableView.removeFromSuperview() // 把searchLabel加回来,恢复界面布局 view.addSubview(searchLabel) UIView.animate(withDuration: 0.3) { self.searchBar.center = CGPoint(x: self.view.frame.midX, y: 你原来的y坐标) // 恢复searchLabel的原始frame self.searchLabel.frame = CGRect(...) } searchBar.setShowsCancelButton(false, animated: true) searchBar.resignFirstResponder() }
内容的提问来源于stack exchange,提问作者tjc
相关产品推荐
相关产品推荐

