簡體   English   中英

SwiftUI 避免重復的 onChange 調用

[英]SwiftUI avoid repeated onChange call

在我的代碼中,“最終”切換的值基於視圖模型中的復雜邏輯。 例如,用戶打開開關,但如果不滿足某些條件,邏輯可以將其關閉(此處簡化為數字比較)。 問題:在用戶打開開關后, onChange被觸發,如果邏輯發現它應該被關閉, onChange將再次被觸發,因為有更改(這次不是由用戶做出的)。

例如,如果生成的隨機數為 5,則控制台打印以下語句(8 來自第二次調用):

 on change called shouldUseToggle called 5 on change called shouldUseToggle called 8 onChange(of: Bool) action tried to update multiple times per frame.

我想避免它並使onChange僅對用戶的更改做出反應,而不是來自視圖模型的更改。 有沒有辦法做到這一點 ? 或者也許有其他方法來解決它?

import SwiftUI

struct ContentView: View {
    @StateObject var myViewModel = MyViewModel()
    
    var body: some View {
        VStack(spacing: 0) {
            Toggle("Use xyz ?", isOn: $myViewModel.turnToggleOn).onChange(of: myViewModel.turnToggleOn, perform: { userTurnedOn in
                print("on change called")
                myViewModel.shouldUseToggle(userTurnedOn: userTurnedOn)
            })
        }
    }
}

class MyViewModel: ObservableObject {
    @Published var turnToggleOn = false
    
    func shouldUseToggle(userTurnedOn: Bool) {
        ///some complex logic comes here, for simplicity I use random numbers
        print("shouldUseToggle called")
        let x = Int.random(in: 0..<10)
        print(x)
        if userTurnedOn {
            turnToggleOn = x > 5
        } else {
            turnToggleOn = x > 3
        }
    }
}

使用自定義綁定並直接從綁定調用您的邏輯函數。

struct ContentView: View {
    
    @StateObject var myViewModel = MyViewModel()
    
    var body: some View {
        VStack(spacing: 0) {
            Toggle("Use xyz ?", isOn: Binding(get: {myViewModel.turnToggleOn}, set: {
                myViewModel.turnToggleOn = $0;
                myViewModel.shouldUseToggle(userTurnedOn: $0)
            }))
        }
    }
}

class MyViewModel: ObservableObject {
    var turnToggleOn = false
    
    func shouldUseToggle(userTurnedOn: Bool) {
        ///some complex logic comes here, for simplicity I use random numbers
        print("shouldUseToggle called")
        let x = Int.random(in: 0..<10)
        print(x)
        if userTurnedOn {
            turnToggleOn = x > 5
        } else {
            turnToggleOn = x > 3
        }
    }
}

暫無
暫無

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

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