Swift 如何将绑定变量传递给ObserveObject?

Swift 如何将绑定变量传递给ObserveObject?,swift,swiftui,Swift,Swiftui,我有一个绑定变量,需要传递给swiftUI中的ObservieObject 假设我有以下代码: struct MYView: View { @ObservedObject var fetch = Fetch() @Binding var IDTxt: Int var body: some View{ //some code here } } 现在我想把IDTxt值传递给这个: public class Fetch:

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

假设我有以下代码:

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)")

    }

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

您不需要传递绑定值。但您可以传递直接值

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
        
    }
}

您不需要传递绑定值。但您可以传递直接值

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
        
    }
}

如果您试图注入到
Fetch
中的属性来自父视图,则不需要
绑定。您只需将该值注入init即可

此外,如果要在
视图
中创建
可观察对象
,则需要将其声明为
@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()
    }

}

如果您试图注入到
Fetch
中的属性来自父视图,则不需要
绑定。您只需将该值注入init即可

此外,如果要在
视图
中创建
可观察对象
,则需要将其声明为
@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()
    }

}


我得到了这个错误:在我的系统中,类型'Fetch.Type'不能与'observeObject'@roozfar compile fine一致。从何处获得此错误?此处:@ObservedObject var fetch:fetch您可以尝试将此代码添加到新项目中吗?问题可能在其他地方。我收到了以下错误:在我的系统中,“Fetch.Type”类型不能与“observeObject”@roozfar compile fine一致。从何处获得此错误?此处:@ObservedObject var fetch:fetch您可以尝试将此代码添加到新项目中吗?问题可能在其他地方。@roozfar是
Combine
的基本构建块之一。当您创建
订阅时
,将返回
anycancelable
,并且只要您持有对
anycancelable
的引用(或者直到您手动调用
cancel
),订阅将保持活动状态。您的代码似乎与我尝试的相反!您正在将IDTxt传递给MyView吗?@roozfar您正试图根据来自视图的
IDTxt
调用
load
,对吗?这正是我的代码所做的
idText
使用用户输入到
TextField
的值进行更新,并且
Fetch
使用该值调用load。很抱歉,IDTxt已经是从另一个视图传递到MYView的变量。现在我需要在Fetch:observeObject中使用它{…没有文本输入。@roozfar更新了我的答案以匹配您的requirements@roozfar
组合
的基本构建块之一。创建
订阅
时,将返回一个
anycancelable
,并且只要您持有对
anycancelable
的引用,订阅将保持活动状态(或直到您手动调用
取消
)。您的代码似乎与我所做的相反!您是否将IDTxt传递给MyView?@roozfar您正试图基于来自视图的
IDTxt
调用
load
,对吗?这正是我的代码所做的。
idText
将使用用户输入到
TextField
Fetch
使用该值调用load。很抱歉,IDTxt已经是从另一个视图传递到MYView的变量。现在我需要在Fetch中使用它:ObservableObject{…没有文本输入。@roozfar更新了我的答案以符合您的要求