尝试使用环境变量从 HostingViewController 呈现 SwiftUI
Posted
技术标签:
【中文标题】尝试使用环境变量从 HostingViewController 呈现 SwiftUI【英文标题】:Trying to present SwiftUI from HostingViewController with Enviroment Variable 【发布时间】:2019-12-27 06:09:12 【问题描述】:我正在尝试使用以下代码从 UI Kit 中展示一些 SwiftUI:
class SavedListViewController: UIHostingController<SavedEventListView>
required init?(coder: NSCoder)
let listView = SavedEventListView().environmentObject(RemindersViewModel())
super.init(rootView: listView) // BUILD ERROR HERE = "Cannot convert value of type 'some View' to expected argument type 'SavedEventListView'"
override func viewDidLoad()
super.viewDidLoad()
当我这样做时,我得到Cannot convert value of type 'some View' to expected argument type 'SavedEventListView'
如果我尝试将listView
强制转换为! SavedEventListView
,应用崩溃了。
如果我不提供环境变量,应用程序也会崩溃。
无法将“SwiftUI.ModifiedContent<_.savedeventlistview swiftui.environmentkeywritingmodifier.remindersviewmodel>>>”(0x7fff89e46b90) 类型的值转换为“_.SavedEventListView”(0x10a2447d0)。
关于如何解决这个问题并让这个 swiftui 视图呈现的任何建议? 谢谢
其他代码
class RemindersViewModel: ObservableObject
@Published var savedEvents = RemindersStore().fetchRuns()
struct SavedEventListView: View
@EnvironmentObject var reminders: RemindersViewModel
var body: some View
NavigationView
List
ForEach(reminders.savedEvents) reminder in
HStack
VStack(alignment: .leading)
HStack
Text("$\(reminder.title)")
.font(.headline)
Text("$\(reminder.category)")
.font(.headline)
.fontWeight(.light)
Spacer()
Text("$\(reminder.date)")
.font(.subheadline)
Spacer()
Image(uiImage: UIImage(systemName: "calendar.badge.minus")!)
.navigationBarTitle("Reminders")
【问题讨论】:
【参考方案1】:这是我会使用的最简单的变体:
class SavedListViewController: UIHostingController<AnyView>
required init?(coder: NSCoder)
let listView = SavedEventListView().environmentObject(RemindersViewModel())
super.init(rootView: AnyView(listView))
override func viewDidLoad()
super.viewDidLoad()
【讨论】:
【参考方案2】:当我要发布答案时,@Asperi 已经发布了。我想为该答案添加一些上下文。
根据您的代码,您似乎使用public init(rootView: Content)
的超级初始化程序而不是init?(coder aDecoder: NSCoder, rootView: Content)
。如果您不使用后者,则在 Interface Builder 中添加到 SavedListViewController
的任何内容都将不可用。所以你需要使用那个超级调用:
class SavedListViewController: UIHostingController<AnyView>
required init?(coder: NSCoder)
let listView = SavedEventListView().environmentObject(RemindersViewModel())
super.init(coder: coder, rootView: AnyView(listView))
override func viewDidLoad()
super.viewDidLoad()
【讨论】:
以上是关于尝试使用环境变量从 HostingViewController 呈现 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章