gpt4 book ai didi

ios - 如何在现有的基于 Storyboard的项目中设置@EnvironmentObject?

转载 作者:行者123 更新时间:2023-12-05 02:43:30 25 4
gpt4 key购买 nike

我有一个使用 StoryboardUIKit 构建的 iOS 项目。现在我想使用 SwiftUI 开发新屏幕。我向现有的 Storyboard 添加了一个托管 View Controller ,并用它来显示我新创建的 SwiftUI View 。

但我不知道如何创建一个可以在整个应用程序的任何地方使用的@EnvironmenetObject。我应该能够在我的任何基于 UIKit 的 ViewController 以及我的 SwiftUI View 中访问/设置它。

这可能吗?如果是这样怎么办?在纯 SwiftUI 应用中,我们设置环境对象如下,

@main
struct myApp: App {
@StateObject var item = Item()

var body: some Scene {
WindowGroup {
MainView()
.environmentObject(item)
}
}
}

但在我的例子中,没有这样的功能,因为它是一个带有 AppDelegateSceneDelegate 的现有 iOS 项目。 Storyboard 中标记了初始 View Controller 。如何设置它并在应用程序的任何位置访问该对象?

最佳答案

.environmentObject 修饰符将 View 的类型从 ItemDetailView 更改为其他类型。强制转换它会导致错误。相反,请尝试将其包装到 AnyView 中。

class OrderObservable: ObservableObject {

@Published var order: String = "Hello"
}

struct ItemDetailView: View {

@EnvironmentObject var orderObservable: OrderObservable

var body: some View {

EmptyView()
.onAppear(perform: {
print(orderObservable.order)
})
}
}

class ItemDetailViewHostingController: UIHostingController<AnyView> {
let appDelegate = UIApplication.shared.delegate as! AppDelegate

required init?(coder: NSCoder) {
super.init(coder: coder,rootView: AnyView(ItemDetailView().environmentObject(OrderObservable())))
}
}

这对我有用。这是您需要的吗?

编辑:好的,所以我在整个 View 中都从 ViewController 设置了属性。它不像使用属性包装器或 View 修改器那么简单,但它确实有效。我试了一下。如果这满足您的要求,请告诉我。此外,我必须摆脱 HostingController 子类。

class ViewController: UIViewController {

var orderObservable = OrderObservable()

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let myVC = (segue.destination as? MyViewController) else { return }
myVC.orderObservable = orderObservable
}
}

class MyViewController: UIViewController {

var orderObservable: OrderObservable!
var anycancellables = Set<AnyCancellable>()
@IBAction @objc func buttonSegueToHostingVC() {
let detailView = ItemDetailView().environmentObject(orderObservable)
present(UIHostingController(rootView: detailView), animated: true)

orderObservable.$order.sink { newVal in
print(newVal)
}
.store(in: &anycancellables)
}
}


class OrderObservable: ObservableObject {

@Published var order: String = "Hello"

init() {
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
self.order = "World"
}
}
}

struct ItemDetailView: View {

@EnvironmentObject var orderObservable: OrderObservable

var body: some View {

Text("\(orderObservable.order)")
}
}

基本上,我在 ViewController 类中创建可观察对象,将其传递给 MyViewController 类,最后使用 ItemDetailView 创建一个托管 Controller 并设置它的 environmentObject 并呈现它。

关于ios - 如何在现有的基于 Storyboard的项目中设置@EnvironmentObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66901476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com