【问题标题】:How we can run some logic stand alone from Views before SwiftUI start rendering ContentView?在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?
【发布时间】:2020-11-04 10:07:37
【问题描述】:

我想知道如何在 SwiftUI 尝试渲染 ContentView 之前运行一些逻辑函数或控制流运算符?我可以在哪里以及如何放置我的代码?

更新:init(){} var body: some Scene

之前

当我使用 init 并在那里执行我的逻辑时,我找不到报告我的过程结果的方法,我该如何解决这个问题?

我的代码:

    import SwiftUI

@main
struct _99App: App
{
    init() {
        let firstName = "omid"
        print(firstName)
    }
    
    @State var name : String = firstName // ← Here        Error: Cannot find 'firstName' in scope
    
    
    var body: some Scene {

        WindowGroup {
            
            ContentView(name: $name)
                
        }
 
        
        
    }
}

PS:基本上我需要一个地方在应用程序发生任何事情之前运行我的逻辑。

【问题讨论】:

标签: swiftui


【解决方案1】:

您可以使用某种ObservableObject 作为StateObject,它将在其他所有内容之前初始化。

所以解决方案可能如下所示

let globalState = MyAppState()

@main
struct _99App: App
{
    @StateObject var appState = globalState
    
    init() {
       globalState.firstName = "updated"
        print("updated")
    }

    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(appState)
            // and use as
            // @EnvironmentObject var appState: MyAppState
            // inside ContentView
        }
    }
}

class MyAppState: ObservableObject {
    @Published var firstName: String
    
    init() {
        self.firstName = "omid"
        print(firstName)
    }
}

【讨论】:

  • 如果你把这段代码 init() { print("⌘") } *** before ***var body: some Scene你会看到它的运行速度比 MyAppState-Class 快,MyAppState 的运行时间几乎与 ContentView 相同,事实上它们是同时发生的,就像多米诺骨牌一样,但我希望代码在应用程序中运行的第一位置!正如您将看到的 ⌘ 的符号总是首先打印,并且比 print(firstName) 更快,我想根据我的逻辑得到那个地方。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2021-02-21
相关资源
最近更新 更多