我是SwiftUI和Swift的新手。每当用户在搜索栏中键入内容时,我都会得到一个搜索栏和一个Listview,这是我发出的http请求,并且有新数据输入。问题是该列表未使用新数据进行更新,我想我知道为什么。 我需要将SearchBar响应传递到ObservedObject变量。我正在阅读此swiftui ObservedObject function call in all view,但仍然没有找到答案。这是我的代码
struct RegistrationView: View {
@State private var searchTerm: String = ""
@State var txt = "" // Txt has the SearchBar text
@ObservedObject var getData = datas(location: "") // I need to pass it here
var body: some View {
VStack {
Text("Registration")
searchView(txt: $txt)
// datas(location: txt)
NavigationView {
List(getData.jsonData.filter{ txt == "" ? true : $0.name.localizedCaseInsensitiveContains(txt)}) { i in
ListRow(name: i.name,statelong: i.statelong)
}
}
.padding(.top, 5.0)
}
}
}
class datas: ObservableObject
{
@Published var jsonData = [datatype]()
init(location: String) {
let session = URLSession(configuration: .default)
if location == "" {
return
}
let parameter = "location=\(location)"
if location == "" {
return
}
let url = URL(string:"url")!
let request = RequestObject(AddToken: true, Url: url, Parameter: parameter)
session.dataTask(with:request, completionHandler: {(data, response, error) in
do
{
if data != nil
{
let fetch = try JSONDecoder().decode([datatype].self, from: data!)
DispatchQueue.main.async {
self.jsonData = fetch
print(fetch)
}
}
}
catch
{
print(error.localizedDescription)
}
}).resume()
}
}
在上面的代码中,我想将 txt 变量传递到 getData 变量中,或执行类似的操作 @ObservedObject var getData = datas(位置: txt)。更新SearchBar之后,txt会获取插入SearchBar中的所有内容。
如果我做这样的事情
@ObservedObject var getData = datas(位置:“ Me”)
然后,列表将更新,并且正确地包含以 Me 开头的所有内容。我唯一的问题是在数据内部获取SearchBar值,因此不必进行硬编码。如前所述,我需要将txt传递给datas。任何帮助都很好
答案 0 :(得分:0)
您无需init
使用该变量的类。您可以为此创建一个函数,并在需要时获取它。可能只有一次。
class datas: ObservableObject {
@Published var jsonData = [datatype]()
func get(location: String) {
let session = URLSession(configuration: .default)
guard !location.isEmpty else { return }
let parameter = "location=\(location)"
let url = URL(string:"url")!
let request = RequestObject(AddToken: true, Url: url, Parameter: parameter)
session.dataTask(with:request, completionHandler: {(data, response, error) in
do {
guard data != nil else { return }
let fetch = try JSONDecoder().decode([datatype].self, from: data!)
DispatchQueue.main.async {
self.jsonData = fetch
print(fetch)
}
} catch {
print(error.localizedDescription)
}
}).resume()
}
}