首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用SwiftUI中的参数初始化@StateObject

使用SwiftUI中的参数初始化@StateObject
EN

Stack Overflow用户
提问于 2020-06-29 10:14:19
回答 10查看 28.5K关注 0票数 103

我想知道当前(在询问时,第一个Xcode 12.0Beta)是否有一种使用来自初始化器的参数初始化@StateObject的方法。

更确切地说,这段代码可以正常工作:

代码语言:javascript
复制
struct MyView: View {
  @StateObject var myObject = MyObject(id: 1)
}

但这并不意味着:

代码语言:javascript
复制
struct MyView: View {
  @StateObject var myObject: MyObject

  init(id: Int) {
    self.myObject = MyObject(id: id)
  }
}

根据我的理解,@StateObject的作用是使视图成为对象的所有者。我使用的当前解决方法是传递已经初始化的MyObject实例,如下所示:

代码语言:javascript
复制
struct MyView: View {
  @ObservedObject var myObject: MyObject

  init(myObject: MyObject) {
    self.myObject = myObject
  }
}

但现在,据我所知,创建对象的视图拥有它,而这个视图不拥有它。

谢谢。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2020-06-29 10:22:33

这是一个解决方案的演示。用Xcode 12+测试。

代码语言:javascript
复制
class MyObject: ObservableObject {
    @Published var id: Int
    init(id: Int) {
        self.id = id
    }
}

struct MyView: View {
    @StateObject private var object: MyObject
    init(id: Int = 1) {
        _object = StateObject(wrappedValue: MyObject(id: id))
    }

    var body: some View {
        Text("Test: \(object.id)")
    }
}

来自苹果(对于所有类似@user832 832的用户):

票数 84
EN

Stack Overflow用户

发布于 2020-08-29 09:30:58

@Asperi给出的答案应该避免,苹果在他们的StateObject文档中这样说。

您不能直接调用这个初始化器。相反,在视图、应用程序或场景中使用@StateObject属性声明一个属性,并提供一个初始值。

苹果试图在引擎盖下进行大量优化,而不是对抗系统。

只需为您希望首先使用的参数创建一个具有Published值的Published。然后使用.onAppear()来设置它的值,其余的将由SwiftUI来完成。

代码:

代码语言:javascript
复制
class SampleObject: ObservableObject {
    @Published var id: Int = 0
}

struct MainView: View {
    @StateObject private var sampleObject = SampleObject()
    
    var body: some View {
        Text("Identifier: \(sampleObject.id)")
            .onAppear() {
                sampleObject.id = 9000
            }
    }
}
票数 52
EN

Stack Overflow用户

发布于 2020-10-20 13:23:31

我想我找到了一个解决办法,可以控制用@StateObject包装的视图模型的实例化。如果在视图上不将视图模型设置为私有,则可以在视图上使用合成的元素,在那里您将能够毫无问题地控制它的实例化。如果需要以公共方式实例化视图,则可以创建一个工厂方法,该方法接收视图模型依赖关系,并使用内部合成的init。

代码语言:javascript
复制
import SwiftUI

class MyViewModel: ObservableObject {
    @Published var message: String

    init(message: String) {
        self.message = message
    }
}

struct MyView: View {
    @StateObject var viewModel: MyViewModel

    var body: some View {
        Text(viewModel.message)
    }
}

public func myViewFactory(message: String) -> some View {
    MyView(viewModel: .init(message: message))
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62635914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档