簡體   English   中英

如何使用 UIKit 在 Swift 5 中立即強制更新我的 UI?

[英]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()

您還可以參考圖表以更好地記住這些遍的順序

在此處輸入圖像描述

關於 layoutIfNeeded 的來源 Apple 文檔

圖片來源 Medium 文章

幾個問題...

如果您有一個“需要一些時間”加載的視圖 controller,您不應該嘗試以這種方式進行加載。

該應用程序將無響應並顯示為“凍結”。

一個更好的方法是:

  • someFuncThatGetsCalled()
    • 隱藏viewLoading並將其替換為活動指示器(微調器或其他讓用戶知道應用程序未卡住的東西)
    • 實例化你的ModelVC
    • ModelVC完成設置后,讓它通知當前的 VC(通過委托)
    • 當前 VC然后顯示/導航到已經實例化和准備好的ModelVC

或者,可能是一個更好的選擇……將您在ModelVC中耗時的設置移動到視圖出現的某個點。 您可以在viewDidLoad()中顯示活動指示器。 這確實是最常見的用戶體驗——當新的 VC 必須檢索遠程數據以顯示時,你總是會看到它——它符合用戶的期望。

暫無
暫無

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

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