將自訂 UIView 作為子視圖加到主視窗,需在關閉按鈕點擊時移除或隱藏該子視圖。
removeFromSuperview():從父視圖移除並釋放(若無其他強引用),視圖層級結構中消失。isHidden = true:保留在視圖層級,僅不渲染,佔用記憶體但可快速切換顯示狀態。let subView = UIView(frame: CGRect(x: 0, y: 0, width: 1024, height: 768))
subView.backgroundColor = UIColor(patternImage: UIImage(named: "bgPopupback")!)
if let window = UIApplication.shared.keyWindow ?? UIApplication.shared.windows.first {
window.subviews.first?.addSubview(subView)
}
@objc func closeButtonAction() {
subView.removeFromSuperview()
tableView.isUserInteractionEnabled = true
}
@objc func closeButtonAction() {
subView.isHidden = true
tableView.isUserInteractionEnabled = true
}
// 再次顯示時
subView.isHidden = false
subView 必須為類別屬性(或透過 tag 從父視圖查找),否則區域變數離開作用域即被釋放,無法在按鈕事件中操作。removeFromSuperview 會釋放視圖持有的資源(如圖片、子視圖),若頻繁建立/銷毀複雜視圖,考慮隱藏/顯示切換以提升效能。window.subviews.first(通常是根視圖控制器的 view),確保彈出層級最高。若需模態效果,建議使用 UIPresentationController 或 UIAlertController 系統方案。class PopupManager {
private weak var hostView: UIView?
private var popupView: UIView?
func showPopup(in view: UIView) {
hostView = view
let popup = UIView(frame: CGRect(x: 50, y: 100, width: 300, height: 200))
popup.backgroundColor = .white
popup.layer.cornerRadius = 12
popup.tag = 999 // 便於查找
let closeBtn = UIButton(type: .system)
closeBtn.setTitle("關閉", for: .normal)
closeBtn.frame = CGRect(x: 260, y: 10, width: 30, height: 30)
closeBtn.addTarget(self, action: #selector(hidePopup), for: .touchUpInside)
popup.addSubview(closeBtn)
view.addSubview(popup)
popupView = popup
}
@objc func hidePopup() {
popupView?.removeFromSuperview() // 或 popupView?.isHidden = true
popupView = nil
}
}
根據業務需求選擇「移除」或「隱藏」:一次性彈窗用移除,頻繁切換的面板用隱藏。