Swift 如何将绑定变量传递给ObserveObject?
我有一个绑定变量,需要传递给swiftUI中的ObservieObject 假设我有以下代码: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:
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更新了我的答案以符合您的要求