如何在 Swift 中移除檢視的所有子檢視?


在 Swift 中,您可以透過使用迴圈遍歷每個子檢視來移除檢視的子檢視。Swift 提供了一個名為 removeFromSuperview() 的方法來從其父檢視中移除檢視。在本文中,您將學習如何使用此方法以及一些示例。

removeFromSuperview()

此方法屬於 Swift 中的 UIView 類。這可以用於從其父檢視中移除檢視物件。要呼叫此方法,您需要從需要從父檢視中移除的檢視物件呼叫它。

當您在檢視上執行 removeFromSuperview() 時,它會向其父檢視傳送一條訊息,請求將該檢視從其子檢視陣列中移除。這表示父檢視不再保留該檢視,並且如果不存在對它的其他強引用,則可以將其釋放。檢視的 window 屬性也設定為 nil,以表示它不再在螢幕上可見。

語法

以下是使用 removeFromSuperview() 的語法

// create a view object
let subView = UIView()

// add it to the parent view
parentView.addSubview(subView)
// ...some other code…

// remove this subView from the parent view
subView.removeFromSuperview()

在此示例中,建立了一個名為 subView 的 UIView 例項,然後使用 addSubview() 方法將其新增為 parentView 的子檢視。之後,在 subView 上呼叫 removeFromSuperview() 以將其從 parentView 中移除。在執行此程式碼行之後,subView 將不再顯示在螢幕上。它不再是 parentView 的子檢視。

以下是一個包含更多上下文和更詳細的示例

  • 步驟 1 − 建立一個 ViewController 來測試此方法

  • 步驟 2 − 建立一些 UIView 屬性

  • 步驟 3 − 配置 redView 並將其新增到 superView 以及一些約束

  • 步驟 4 − 配置 yellowView 並將其新增到 superView 以及一些約束

示例

import UIKit
class TestController: UIViewController {
    
   // creating some views
   let redView = UIView()
   let yellowView = UIView()
    
   override func viewDidLoad() {
      super.viewDidLoad()
      initialSetup()
   }    
   private func initialSetup() {
        
      view.backgroundColor = .white
      navigationItem.title = "UIView"
        
      // configuring the redView and adding it to the superView along with some constraints
      redView.backgroundColor = .red
      redView.translatesAutoresizingMaskIntoConstraints = false
      redView.layer.cornerRadius = 6
      redView.clipsToBounds = true
      view.addSubview(redView)
      redView.heightAnchor.constraint(equalToConstant: 150).isActive = true
      redView.widthAnchor.constraint(equalToConstant: 150).isActive = true
      redView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 100).isActive = true
      redView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
            
      // configuring the yellowView and adding it to superView along with some constraints
      yellowView.backgroundColor = .yellow
      yellowView.translatesAutoresizingMaskIntoConstraints = false
      yellowView.layer.cornerRadius = 6
      yellowView.clipsToBounds = true
      view.addSubview(yellowView)
      yellowView.heightAnchor.constraint(equalToConstant: 150).isActive = true
      yellowView.widthAnchor.constraint(equalToConstant: 150).isActive = true
      yellowView.topAnchor.constraint(equalTo: redView.bottomAnchor, constant: 50).isActive = true
      yellowView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
   }
}

輸出

執行上述程式碼後,您將看到兩個子檢視都顯示在主螢幕上。以下是輸出。

如果要移除檢視的所有子檢視但保留檢視本身,您可以新增以下程式碼:

func removeAllSubviews() {
    
   // perform a loop to iterate each subView
   view.subviews.forEach { subView in
        
   // removing subView from its parent view
      subView.removeFromSuperview()
   }
}

此程式碼使用 forEach 方法迭代 parentView 的 subviews 陣列並從 parentView 中移除每個子檢視。此程式碼與上一段程式碼的區別在於,它使用閉包在每個子檢視上呼叫 removeFromSuperview(),而不是使用 for 迴圈。

執行上述程式碼後,您將看到兩個子檢視都從主螢幕消失。以下是輸出:

以下是一些更多涉及根據特定條件移除子檢視的示例

示例 1:移除特定型別的全部子檢視

假設您有一個包含多個不同型別子檢視的 parentView,例如 UILabel、UIButton 和 UIImageView。您想要移除所有 UILabel 子檢視。您可以使用以下程式碼來實現此目的:

for case let label as UILabel in parentView.subviews {
   label.removeFromSuperview()
}

此程式碼使用帶有 case let 模式匹配語法的 for 迴圈迭代 parentView 的 subviews 陣列。case let 語法檢查每個子檢視是否為 UILabel 的例項。如果子檢視是 UILabel,則呼叫其 removeFromSuperview() 方法將其從 parentView 中移除。

示例 2:移除滿足特定條件的所有子檢視

例如,您有一個包含許多不同型別子檢視的 parentView。您想要移除所有具有特定屬性值的子檢視。例如,假設您想要移除所有標題屬性等於“刪除”的 UIButton 子檢視。您可以使用以下程式碼來實現此目的:

for case let button as UIButton in parentView.subviews where button.title(for: .normal) == "Delete" {
   button.removeFromSuperview()
}

此程式碼使用帶有 case let 模式匹配語法和 where 子句的 for 迴圈迭代 parentView 的 subviews 陣列。case let 語法檢查每個子檢視是否為 UIButton 的例項。where 子句檢查按鈕的 title 屬性是否等於“刪除”。如果這兩個條件都為真,則呼叫按鈕的 removeFromSuperview() 方法將其從 parentView 中移除。

結論

總之,在 Swift 中移除檢視的所有子檢視有多種方法。您可以使用 for 迴圈、while 迴圈、guard 語句或遞迴來從檢視層次結構中移除每個子檢視。您選擇的方法將取決於您的特定需求和編碼風格。無論您使用哪種方法,請確保徹底測試您的程式碼以確保其按預期工作。

更新於:2023年4月24日

4K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.