SwiftUI Pickerの選択が変更されたときに関数を呼び出す方法はありますか?


8

selectedOptionの値が変更されたときに関数を呼び出したいのですが。TextFieldを編集する場合と同様に、SwiftUIでこれを行う方法はありますか?

具体的には、ユーザーがselectedOptionを変更したときに、選択したオプションを保存します。

これが私のピッカーです:

struct BuilderPicker: View {
    let name: String
    let options: Array<String>
    @State var selectedOption = 0
    var body: some View {
        HStack {
            Text(name)
                .font(.body)
                .padding(.leading, 10)
            Picker(selection: $selectedOption, label: Text(name)) {
                ForEach(0 ..< options.count) {
                    Text(self.options[$0]).tag($0)
                }
            }.pickerStyle(SegmentedPickerStyle())
                .padding(.trailing, 25)
        }.onTapGesture {
            self.selectedOption = self.selectedOption == 0 ? 1 : 0
        }
            .padding(.init(top: 10, leading: 10, bottom: 10, trailing: 0))
            .border(Color.secondary, width: 3)
            .padding(.init(top: 0, leading: 15, bottom: 0, trailing: 15))
            .font(.body)
    }

}

私はまだSwiftUIを初めて使用するので、助けが欲しいです。ありがとう!

回答:


10

@State値がビューで使用される場合、追加の変数は必要ありません name

  struct BuilderPicker: View {
// let name: String = ""
 let options: Array<String> = ["1", "2","3","4","5"]
 @State var selectedOption = 0
 var body: some View {
    HStack {
        Text(options[selectedOption])
            .font(.body)
            .padding(.leading, 10)
        Picker(selection: $selectedOption, label:    Text(options[selectedOption])) {
            ForEach(0 ..< options.count) {
                Text(self.options[$0]).tag($0)
            }
        }.pickerStyle(SegmentedPickerStyle())
            .padding(.trailing, 25)}
//        }.onTapGesture {
//            self.selectedOption = self.selectedOption == 0 ? 1 : 0
//        }
        .padding(.init(top: 10, leading: 10, bottom: 10, trailing: 0))
        .border(Color.secondary, width: 3)
        .padding(.init(top: 0, leading: 15, bottom: 0, trailing: 15))
        .font(.body)
    }


 }

@Stateで個別の操作が必要な場合、最も簡単な方法は、ビューにonReceive()を1行追加することです。

  HStack {
        Text("")
            .font(.body)
            .padding(.leading, 10)
        Picker(selection: $selectedOption, label: Text("")) {
            ForEach(0 ..< options.count) {
                Text(self.options[$0]).tag($0)
            }
        }.pickerStyle(SegmentedPickerStyle())
            .padding(.trailing, 25)}
  //        }.onTapGesture {
 //            self.selectedOption = self.selectedOption == 0 ? 1 : 0
 //        }
        .padding(.init(top: 10, leading: 10, bottom: 10, trailing: 0))
        .border(Color.secondary, width: 3)
        .padding(.init(top: 0, leading: 15, bottom: 0, trailing: 15))
        .font(.body)
        .onReceive([self.selectedOption].publisher.first()) { (value) in
            print(value)
    }

didSetが機能しないのは、onTapGestureをコメントアウトしたためです。私は今あなたの考えを試みています。
イーライフロント

@state VAR上のすべてのものが内蔵されている場合、余分なジェスチャーを使用しないでください。
E.Coms

これは機能しますが、これを行うにはより良い方法があるはずです。ありがとう!
イーライフロント

5
これは機能しますが、 "[self.selectedOption] .publisher.first()" w00t?:)
sabiland

2
ある[self.selectedOption].publisher.first()公開APIは?それはパブリックAPIのように感じませんが、それはうまくいきます。
Iron John Bonney
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.