簡體   English   中英

如何使用 SwiftUI 觀察 TextField 值並結合?

[英]How to observe a TextField value with SwiftUI and Combine?

每次更改textField的值時,我都會嘗試執行一個操作。

@Published var value: String = ""

var body: some View {            
     $value.sink { (val) in
        print(val)
     }
     return TextField($value)       
}

但我得到以下錯誤。

無法將“已發布”類型的值轉換為預期的參數類型“綁定”

這應該是一種非脆弱的方式:

class MyData: ObservableObject {
    var value: String = "" {
        willSet(newValue) {
            print(newValue)
        }
    }
}

struct ContentView: View {
    @ObservedObject var data = MyData()
    var body: some View {
        TextField("Input:", text: $data.value)
    }
}

在您的代碼中, $value是一個發布者,而TextField需要一個綁定。 雖然您可以從@Published更改為@State甚至@Binding ,但是當值更改時無法觀察到事件。

似乎沒有辦法觀察綁定。

另一種方法是使用ObservableObject來包裝您的值類型,然后觀察發布者 ( $value )。

class MyValue: ObservableObject {
  @Published var value: String = ""
  init() {
    $value.sink { ... }
  }
}

然后在您看來,您擁有綁定$viewModel.value

struct ContentView: View {
    @ObservedObject var viewModel = MyValue()
    var body: some View {
        TextField($viewModel.value)
    }
}

我不為此使用組合。 這對我有用:

 TextField("write your answer here...",
            text: Binding(
                     get: {
                        return self.query
                       },
                     set: { (newValue) in
                        self.fetch(query: newValue) // any action you need
                                return self.query = newValue
                      }
            )
  )

我不得不說這不是我的想法,我在這個博客中讀到了它: SwiftUI binding:一個非常簡單的技巧

如果你想觀察value那么它應該是一個State

@State var value: String = ""

您可以通過使用方法觀察TextField值,

import SwiftUI
import Combine

struct ContentView: View {
     
    @State private var Text1 = ""
    @State private var Text2 = ""
    @ObservedObject var viewModel = ObserveTextFieldValue()
    
    var body: some View {
        
            //MARK: TextField with Closures
              TextField("Enter text1", text: $Text1){
                  editing in
                  print(editing)
              }onCommit: {
                  print("Committed")
              }
        
            //MARK: .onChange Modifier
              TextField("Enter text2", text: $Text2).onChange(of: Text2){
                  text in
                     print(text)
              }
    
            //MARK: ViewModel & Publisher(Combine)
              TextField("Enter text3", text: $viewModel.value)
    }
}



class ObserveTextFieldValue: ObservableObject {
  @Published var value: String = ""
  private var cancellables = Set<AnyCancellable>()
  init() {
      $value.sink(receiveValue: {
          val in
          print(val)
      }).store(in: &cancellables)
  }
}

@Published 是 SwiftUI 中最有用的屬性包裝器之一,它允許我們創建可觀察對象,這些對象會在發生更改時自動通知,這意味着每當帶有標記為 @Published 的屬性的 object 發生更改時,使用該 ZA8CFDE6331BD59EB2AC96F891 的所有視圖都將被重新加載到那些變化。

import SwiftUI

struct ContentView: View {
    @ObservedObject var textfieldData = TextfieldData()
    var body: some View {
        TextField("Input:", text: $textfieldData.data)
    }
}

class TextfieldData: ObservableObject{
   @Published var data: String = ""
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

暫無
暫無

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

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