簡體   English   中英

SwiftUI - 選擇器更改時選擇器綁定不更新

[英]SwiftUI - Picker binding not updating when picker changes

在我看來,我有一個選擇器作為分段選擇器。 每當我通過滑動更改選擇器時,它不會更新/打印更新。 如果我點擊它,它會更改/更新。 當我將它從一個選項滑到另一個選項時,希望它更新。 我也嘗試使用 a.tag 修飾符而不是 .id,但都不起作用:(

private let options = ["option1","option2"]

 @State private var urlMode = 0 {
        didSet {
            print("url mode set to \(urlMode)")
            
        }
    }

var url: String {
            if urlMode == 0 {
               return "www.google.com"
            } else {
               return "www.yahoo.com"
            }
        }

Return ZStack {

 Picker("", selection: $urlMode) {
                    ForEach(0..<options.count) { index in
                        Text(options[index])
                            .id(index)
                    }
                }
                .pickerStyle(SegmentedPickerStyle())
                .padding(.bottom, K.ScreenSize.screenWidth / 50)
                .padding(.horizontal)
                .onTapGesture {
                    if urlMode == 0 {
                        urlMode = 1
                    } else {
                        urlMode = 0
                    }
                }
}

事實證明,該值已被設置,但它沒有更新/運行我的@State var 的“didSet”部分......對我來說,一個簡單的方法是在我的 Picker 上方添加一個 Text,如下所示:

Text("selection: \(options[urlMode])")

當我更改選擇器時,這個值更新了......所以,由於某種原因,didSet 沒有打印,但它確實運行正常......

如果您正在閱讀本文並且需要在此更改時運行代碼的另一種方法,請使用上面的 jnpdx 答案,或對您的 Picker 使用 a.onChange 修飾符(確保按原樣使用它,而不是作為綁定/使用 $):

.onChange(of: urlMode) { value in
                    //code to run
                }

有多種方法可以實現您正在尋找的鏈接。 我推薦一個帶有@Published屬性的ObservableObject ,您可以使用onReceive觀察它來執行您的打印語句。

tag現在也可以與ForEach一起使用:

class ViewModel : ObservableObject {
    let options = ["option1","option2"]
    @Published var urlMode = 0
}

struct ContentView: View {
    @ObservedObject var viewModel = ViewModel()
    
    var url: String {
        if viewModel.urlMode == 0 {
            return "www.google.com"
        } else {
            return "www.yahoo.com"
        }
    }
    
    var body: some View {
        ZStack {
            Picker("", selection: $viewModel.urlMode) {
                ForEach(Array(viewModel.options.enumerated()), id: \.1.self) { (index,option) in
                    Text(option).tag(index)
                }
            }
            .pickerStyle(SegmentedPickerStyle())
            .padding(.horizontal)
        }.onReceive(viewModel.$urlMode) { (mode) in
            print("url mode set to \(mode)")
        }
    }
}

暫無
暫無

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

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