SwiftUI 如何将数据传递给 ObservedObject 函数

Posted

技术标签:

【中文标题】SwiftUI 如何将数据传递给 ObservedObject 函数【英文标题】:SwiftUI How can I pass in data into an ObservedObject function 【发布时间】:2019-11-24 18:08:05 【问题描述】:

我是 SwiftUI 和 Swift 的新手。每当用户在搜索栏中键入内容时,我都会得到一个搜索栏和一个列表视图,我会发出一个 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(location: txt) 。当 SearchBar 更新时,txt 会获取插入到 SearchBar 中的任何内容。

如果我这样做

@ObservedObject var getData = datas(location: "Me")

然后列表将更新并正确包含以 Me 开头的所有内容,我唯一的问题是在数据中获取 SearchBar 值,因此我不必硬编码。如前所述,我需要将 txt 传递给 datas 。任何帮助都会很棒

【问题讨论】:

【参考方案1】:

您不需要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()
    

【讨论】:

以上是关于SwiftUI 如何将数据传递给 ObservedObject 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据传递给BottomSheetDialogFragment [重复]

如何通过数组将数据传递给表格视图?

重新加载后如何将数据传递给局部视图

Ios:如何将数据传递给 UISplitViewController?

如何将数据传递给子 UINavigationController?

在准备 segue 时,如何将数据传递给子 UIViewController?