Ios SwiftUI联合去盎司文本字段
我有一个具有SwiftUI应用生命周期的SwiftUI应用。我正在尝试设置一种标准的添加方式 在文本字段中键入debounce。理想情况下,我希望创建自己的TextField修饰符 可以轻松应用于具有许多文本字段可编辑的视图。我已经试过很多了 但我肯定错过了一些基本的东西。这里有一个例子。这 不起作用:Ios SwiftUI联合去盎司文本字段,ios,xcode,swiftui,combine,Ios,Xcode,Swiftui,Combine,我有一个具有SwiftUI应用生命周期的SwiftUI应用。我正在尝试设置一种标准的添加方式 在文本字段中键入debounce。理想情况下,我希望创建自己的TextField修饰符 可以轻松应用于具有许多文本字段可编辑的视图。我已经试过很多了 但我肯定错过了一些基本的东西。这里有一个例子。这 不起作用: struct ContentView: View { @State private var searchText = "" var body: s
struct ContentView: View {
@State private var searchText = ""
var body: some View {
VStack {
Text("You entered: \(searchText)")
.padding()
TextField("Enter Something", text: $searchText)
.frame(height: 30)
.padding(.leading, 5)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color.blue, lineWidth: 1)
)
.padding(.horizontal, 20)
.onChange(of: searchText, perform: { _ in
var subscriptions = Set<AnyCancellable>()
let pub = PassthroughSubject<String, Never>()
pub
.debounce(for: .seconds(1), scheduler: DispatchQueue.main)
.collect()
.sink(receiveValue: { t in
self.searchText = t.first ?? "nothing"
} )
.store(in: &subscriptions)
})
}
}
}
任何指导都将不胜感激。Xcode 12.4、iOS 14.4我认为您必须保留两个变量:一个用于用户键入时字段中的文本,另一个用于取消发音的文本。否则,用户将看不到实时输入,我假设这不是您想要的行为。我猜这可能是更标准的用例,比如说,在用户暂停输入后执行数据提取 我喜欢观察对象,并结合起来管理这类事情:
class TextFieldObserver : ObservableObject {
@Published var debouncedText = ""
@Published var searchText = ""
private var subscriptions = Set<AnyCancellable>()
init() {
$searchText
.debounce(for: .seconds(1), scheduler: DispatchQueue.main)
.sink(receiveValue: { t in
self.debouncedText = t
} )
.store(in: &subscriptions)
}
}
struct ContentView: View {
@StateObject var textObserver = TextFieldObserver()
@State var customText = ""
var body: some View {
VStack {
Text("You entered: \(textObserver.debouncedText)")
.padding()
TextField("Enter Something", text: $textObserver.searchText)
.frame(height: 30)
.padding(.leading, 5)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color.blue, lineWidth: 1)
)
.padding(.horizontal, 20)
Divider()
Text(customText)
TextFieldWithDebounce(debouncedText: $customText)
}
}
}
struct TextFieldWithDebounce : View {
@Binding var debouncedText : String
@StateObject private var textObserver = TextFieldObserver()
var body: some View {
VStack {
TextField("Enter Something", text: $textObserver.searchText)
.frame(height: 30)
.padding(.leading, 5)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color.blue, lineWidth: 1)
)
.padding(.horizontal, 20)
}.onReceive(textObserver.$debouncedText) { (val) in
debouncedText = val
}
}
}
我举了两个例子——顶部,容器视图ContentView拥有ObserveObject;底部,它被制作成一个更可重用的组件。我认为您必须保留两个变量:一个用于用户键入时字段中的文本,另一个用于取消公告的文本。否则,用户将看不到实时输入,我假设这不是您想要的行为。我猜这可能是更标准的用例,比如说,在用户暂停输入后执行数据提取 我喜欢观察对象,并结合起来管理这类事情:
class TextFieldObserver : ObservableObject {
@Published var debouncedText = ""
@Published var searchText = ""
private var subscriptions = Set<AnyCancellable>()
init() {
$searchText
.debounce(for: .seconds(1), scheduler: DispatchQueue.main)
.sink(receiveValue: { t in
self.debouncedText = t
} )
.store(in: &subscriptions)
}
}
struct ContentView: View {
@StateObject var textObserver = TextFieldObserver()
@State var customText = ""
var body: some View {
VStack {
Text("You entered: \(textObserver.debouncedText)")
.padding()
TextField("Enter Something", text: $textObserver.searchText)
.frame(height: 30)
.padding(.leading, 5)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color.blue, lineWidth: 1)
)
.padding(.horizontal, 20)
Divider()
Text(customText)
TextFieldWithDebounce(debouncedText: $customText)
}
}
}
struct TextFieldWithDebounce : View {
@Binding var debouncedText : String
@StateObject private var textObserver = TextFieldObserver()
var body: some View {
VStack {
TextField("Enter Something", text: $textObserver.searchText)
.frame(height: 30)
.padding(.leading, 5)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color.blue, lineWidth: 1)
)
.padding(.horizontal, 20)
}.onReceive(textObserver.$debouncedText) { (val) in
debouncedText = val
}
}
}
我包括了两个例子——顶部,容器视图ContentView拥有ObserveObject;底部,它被制作成一个更可重用的组件