尝试使用环境变量从 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的主要内容,如果未能解决你的问题,请参考以下文章

从 Docker 容器中获取环境变量

无法从 cron 作业中找到 dotenv 环境变量

postman+newman脚本化接口测试

如何从 Gradle 构建中设置环境变量?

使用 Docker 和 PHP 从 env 文件加载环境变量

为啥我不能在 cmd 中设置环境变量。无法使用 azcopy 从 S3 复制