簡體   English   中英

SwiftUI:有條件地隱藏視圖而不重新創建它

[英]SwiftUI: Conditionally hide a view without recreating it

條件視圖修飾符的問題

我在 SwiftUI 中大量使用了條件視圖修飾符,直到我遇到了一些問題並且最近發現這是一個壞主意

根據我現在的理解,做這樣的事情:

if condition {
    view
} else {
    view.hidden()
}

意味着 SwiftUI 會將兩種情況下的view視為完全不同的視圖。 因此,如果您從 if 跳轉到 else 或反之,則會重新創建視圖,包括運行onAppear和任何初始動畫。 除此之外,它還將動畫view從一個分支中斷到另一個分支。 即使添加.id()似乎也不能解決這個問題。

我附上了一個最小的可行示例,以便您自己查看此行為。 不用說,這很糟糕。 如果您在onAppear中執行一些繁重的操作(如網絡請求),它會影響性能,破壞動畫,甚至更糟。

解決方案?

解決方案似乎是做這樣的事情:

view.padding(condition? 10 : 0)

一切都很順利,SwiftUI 可以隨時view ,很棒。

問題:.isHidden()

現在,我需要有條件地隱藏一個視圖。 老實說,我不知道如何實現它。 .isHidden()沒有參數來啟用或禁用它,因此無法使用與上面所示相同的方法。

那么:如何有條件地隱藏視圖而不重新創建它? 我不想重新創建視圖的原因是onAppear再次被調用,它重置了視圖的狀態,再次觸發動畫到初始狀態。 還是我在這里完全在 SwiftUI 世界中使用了錯誤的方法?

一種可能的方法是使用 opacity+disabled,例如

view
  .opacity(isHidden ? 0 : 1)
  .disabled(isHidden ? true : false)

在 SwiftUI 中,View 結構只是數據,SwiftUI 負責區分數據並決定在屏幕上添加、刪除、更新哪些實際的 UIView。 因此,如果您想隱藏某些內容,只需給它空數據,例如

Text(showText ? "Some text" : "")

了解您要顯示/隱藏的數據會很有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM