如何将绑定变量传递给 ObservableObject?

Posted

技术标签:

【中文标题】如何将绑定变量传递给 ObservableObject?【英文标题】:How to pass Binding variable to an ObservableObject? 【发布时间】:2021-05-26 14:52:33 【问题描述】:

我有一个绑定变量需要传递给 swiftUI 中的 ObservableObject。

假设我有这个代码:

struct MYView: View 

    @ObservedObject var fetch = Fetch()
    
    @Binding var IDTxt: Int
      
    var body: some View
    
    //some code here

    


现在我想将IDTxt 值传递给这个:

public class Fetch: ObservableObject 

   
   //I need to pass the Binding variable here. something like this?
   @Binding var IDTxt: Int
    
    init()
        load()
    
    
    func load() 

    //So I can use it here like this:

    let url = URL(string: "http://someurl.com/\(IDTxt)")

    

有人可以就上述问题提出建议吗?

【问题讨论】:

【参考方案1】:

您不需要传递 Binding 值。但是你可以直接传递值。

public class Fetch: ObservableObject 
    
    var IDTxt: Int
    
    init(id: Int)
        self.IDTxt = id
        load()
    
    
    func load() 
        
        //So I can use it here like this:
        
        let url = URL(string: "http://someurl.com/\(IDTxt)")
        
    


struct MYView: View 
    
    @ObservedObject var fetch: Fetch
    
    @Binding var IDTxt: Int
    
    init(IDTxt: Binding<Int>) 
        self._IDTxt = IDTxt
        self.fetch = Fetch(id: IDTxt.wrappedValue)
    
    
    var body: some View
        
        //some code here
        Color.red
        
    

如果您想观察 IDTxt 文本,请在课堂上使用 @Published

public class Fetch: ObservableObject 
    
    @Published var IDTxt: Int

【讨论】:

我收到此错误:类型“Fetch.Type”不能符合“ObservableObject” @roozfar 在我的系统中编译得很好。你在哪里得到这个错误? 这里:@ObservedObject var fetch: Fetch 您可以尝试将此代码添加到新项目中吗?问题可能出在其他地方。【参考方案2】:

如果您尝试注入Fetch 的属性来自父视图,则不需要Bindings。您可以简单地在 init 中注入值。

另外,如果您在View 中创建ObservableObject,则需要将其声明为@StateObject@ObservedObject 只能在将对象注入视图时使用。

public class Fetch: ObservableObject 
    
    init(id: Int) 
        load(id: id)
    
    
    func load(id: Int) 
        let url = URL(string: "http://someurl.com/\(id)")

    


struct MYView: View 

    @StateObject private var fetch: Fetch

    init(id: Int) 
        self._fetch = StateObject(wrappedValue: Fetch(id: id))
    
      
    var body: some View
        EmptyView()
    


【讨论】:

@roozfar Combine 的基本构建块之一。当您创建Subscription 时,将返回一个AnyCancellable,并且只要您持有对AnyCancellable 的引用(或者直到您手动调用cancel),订阅才会保持活动状态。 您的代码似乎与我正在尝试做的相反!您是否将 IDTxt 传递给 MyView? @roozfar 您正试图根据来自视图的idTxt 调用load,对吧?这正是我的代码正在做的事情。 idText 使用用户输入到 TextField 的值进行更新,Fetch 使用该值调用 load。 对不起,IDTxt 已经是从另一个视图传递到我的 MYView 的变量。现在我需要在 Fetch 中使用它:ObservableObject ... there's no TextInput. @roozfar 更新了我的答案以符合您的要求

以上是关于如何将绑定变量传递给 ObservableObject?的主要内容,如果未能解决你的问题,请参考以下文章

将事件和本地 vue 变量传递给绑定函数的惯用方式

如何按值将变量传递给匿名javascript函数?

将绑定传递给类型属性包装器的变量 - 失去基础类型

将范围传递给回调函数/绑定

如何使用绑定变量执行 SQL 脚本

如何使用批处理文件将绑定变量值传递给 SQLplus