簡體   English   中英

在 SwiftUI 中重繪視圖時運行

[英]run when a view redraws in SwiftUI

我在 SwiftUI 中有一個視圖,我希望它在模型中的變量發生變化時重繪和運行閉包。 我正在使用這個閉包來更新我存儲在視圖中的狀態變量,它應該是模型中變量在它改變之前的先前值

下面的代碼模擬了我的情況:

let viewModel = ViewModel()

struct someView: View {

@observedObject var viewModel: ViewModel = viewModel
@State var previousSomeValue: CGFloat = 0 

    var body: some View {
        Text("\(viewModel.model.someValue)")
    }
}

class ViewModel: ObservableObject {

@Published var model = Model()

}

struct model {

    var someValue: CGFloat = 0

}

使用此設置,如果 someValue 發生更改, someView 會重繪,但是,我無法觸發閉包。

//我嘗試過的解決方案:

主要的是將onChangeOf(_ (T)->Void)附加到我的視圖中。 使用.onChangeOf( viewModel.model.someValue ) { _ in //do something }我可以在閉包發生變化時觸發閉包,但是,當它運行時,viewModel.model.someValue 已經更新為 newValue,並且我無法捕獲舊的。 我在文檔中讀到這是設計使然,您必須捕獲要存儲其舊值的東西,但我(據我所知)只能捕獲 self、viewModel,但不能捕獲 viewModel.model.someValue。

.onChangeOf( viewModel.model.someValue ) { [self] newValue in //do something } //works but doesnt capture the var

.onChangeOf( viewModel.model.someValue ) { [viewModel] newValue in //do something } //works but doesnt capture the var

.onChangeOf( viewModel.model.someValue ) { [viewModel.model.someValue] newValue in //do something } //does not compile (  Expected 'weak', 'unowned', or no specifier in capture list )

我還嘗試在視圖中創建綁定,例如Binding { gameView.model.someValue } set: { _ in }並使用 onChange 觀察者代替,但即使我捕獲自我,當調用閉包時,舊的和新值是相同的。

這似乎是一件很常見的事情(檢測外部變化並觸發閉包),我應該怎么做?

如果我正確理解了您的需求,那么您不應該在視圖中而是在視圖模型中執行此操作,例如

class ViewModel: ObservableObject {
    var onModelChanged: (_ old: Model, _ new: Model) -> Void
    @Published var model = Model() {
        didSet {
            onModelChanged(oldValue, model)
        }
    }

    init(onModelChanged: @escaping (_ old: Model, _ new: Model) -> Void = {_, _ in}) {
        self.onModelChanged = onModelChanged
    }
}

所以實例化ViewModel你可以提供一個回調來觀察模型中改變的值並擁有新舊值,比如

@StateObject var viewModel = ViewModel() {
    print("Old value: \($0.someValue)")
    print("New value: \($1.someValue)")
}

備份

暫無
暫無

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

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