尝试使用SwiftUI将ViewController视图放置到ViewController中,但收到以下错误:
未发现ObservableObject型UIStateModel。作为此视图的祖先,可能缺少用于View.environmentObject(_:)的UIStateModel。
所有的帮助都很感激,我被困住了。
ViewController.swift
class ViewController: UIViewController {
@EnvironmentObject var UIModel: UIStateModel
var uiState: UIStateModel = UIStateModel()
override func viewDidLoad() {
super.viewDidLoad()
addCarousel()
}
func addCarousel(){
let snapC : SnapCarousel
let contentView : UIHostingController<SnapCarousel>
uiState = UIStateModel()
snapC = SnapCarousel( UIState: uiState )
contentView = UIHostingController(rootView: snapC)
addChild(contentView)
view.addSubview(contentView.view)
contentView.didMove(toParent: self)
}
}
Carousel.swift
struct SnapCarousel: View {
var UIState: UIStateModel
//Carousel instantiation
}
struct Card: Decodable, Hashable, Identifiable {
//code
}
public class UIStateModel: ObservableObject {
@Published var activeCard: Int = 0
@Published var screenDrag: Float = 0.0
}
struct Carousel<Items : View> : View {
@EnvironmentObject var UIState: UIStateModel
//card management
}
struct Canvas<Content : View> : View {
// view manager
}
struct Item<Content: View>: View {
@EnvironmentObject var UIState: UIStateModel
//code for card view
}
发布于 2022-01-11 12:00:01
您需要将UIStateModel
注册为@EnvironmentObject
,以便可以将其自动注入子视图中。
首先,更新SnapCarousel
以保存environmentObject:
struct SnapCarousel: View {
@EnvironmentObject var UIState: UIStateModel
//Carousel instantiation
}
若要将模型注册为环境对象,当使用SnapCarousel
注册为:
let snapC = SnapCarousel()
snapC.environmentObject(uiState)
如果不需要引用uiState
,则可以将整个过程简化为:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
addCarousel()
}
func addCarousel() {
let controller = UIHostingController(rootView: SnapCarousel().environmentObject(UIStateModel()))
addChild(controller)
view.addSubview(controller.view)
controller.didMove(toParent: self)
// add some constraints to fill the parent view
NSLayoutConstraint.activate([
controller.view.widthAnchor.constraint(equalTo: view.widthAnchor),
controller.view.heightAnchor.constraint(equalTo: view.heightAnchor),
controller.view.centerXAnchor.constraint(equalTo: view.centerXAnchor),
controller.view.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
}
https://stackoverflow.com/questions/70672458
复制