首页 > 解决方案 > SwiftUI - 选择器更改时选择器绑定不更新

问题描述

在我看来,我有一个选择器作为分段选择器。每当我通过滑动更改选择器时,它不会更新/打印更新。如果我点击它,它会更改/更新。当我将它从一个选项滑到另一个选项时,希望它更新。我还尝试使用 .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
                    }
                }
}

标签: iosswiftswiftuireturn

解决方案


有多种方法可以实现您正在寻找的链接。我推荐一个ObservableObjectwith@Published属性,你可以观察它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)")
        }
    }
}

推荐阅读