[英]How can I force update my UI immediately in Swift 5 using UIKit?
我的 UI 遇到了問題,它沒有立即更新。
我先打電話給someCustomView.isHidden = false
。 之后,我創建了一個新View Controller
的新實例。 在新的 VC viewDidLoad()
中,我正在加載一個“新的機器學習模型”,這需要一些時間。
private func someFuncThatGetsCalled() {
print("1")
self.viewLoading.isHidden = false
print("2")
performSegue(withIdentifier: "goToModelVCSegue", sender: nil)
}
只要我按下調用此 function 的按鈕,控制台就會打印“1”和“2”。 但是,在我的新 VC 的viewDidLoad()
完成之前,該視圖不可見。
是否有可能立即強制更新UIView
? setNeedsDisplay()
對我不起作用。
謝謝你的幫助!
使用layoutIfNeeded()
Apple 文檔
layoutIfNeeded()
如果布局更新掛起,則立即布置子視圖。 使用此方法強制視圖立即更新其布局。 使用自動布局時,布局引擎會根據需要更新 position 個視圖以滿足約束的變化。 使用接收消息的視圖作為根視圖,此方法從根開始布置視圖子樹。 如果沒有待處理的布局更新,此方法將退出而不修改布局或調用任何與布局相關的回調。
所以根據經驗,
layoutifneeded
: Immediate(當前更新周期),同步調用
setNeedsLayout
:relaxed(等待下一個更新周期),異步調用
因此, layoutIfNeeded
表示請立即更新,而setNeedsLayout
表示請更新,但您可以等到下一個更新周期。
如何使用
yourView.layoutIfNeeded()
您還可以參考圖表以更好地記住這些遍的順序
幾個問題...
如果您有一個“需要一些時間”加載的視圖 controller,您不應該嘗試以這種方式進行加載。
該應用程序將無響應並顯示為“凍結”。
一個更好的方法是:
someFuncThatGetsCalled()
上
viewLoading
並將其替換為活動指示器(微調器或其他讓用戶知道應用程序未卡住的東西)ModelVC
ModelVC
完成設置后,讓它通知當前的 VC(通過委托)ModelVC
或者,可能是一個更好的選擇……將您在ModelVC
中耗時的設置移動到視圖出現后的某個點。 您可以在viewDidLoad()
中顯示活動指示器。 這確實是最常見的用戶體驗——當新的 VC 必須檢索遠程數據以顯示時,你總是會看到它——它符合用戶的期望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.