在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?
Posted
技术标签:
【中文标题】在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?【英文标题】:How we can run some logic stand alone from Views before SwiftUI start rendering ContentView? 【发布时间】: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:基本上我需要一个地方在应用程序发生任何事情之前运行我的逻辑。
【问题讨论】:
这是否回答了您的问题***.com/a/63525968/12299030? 【参考方案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) 更快,我想根据我的逻辑得到那个地方。以上是关于在 SwiftUI 开始渲染 ContentView 之前,我们如何从 Views 中独立运行一些逻辑?的主要内容,如果未能解决你的问题,请参考以下文章
AppDelegate 和 ContentView() 之间的 SwiftUI 通信
如何在 SwiftUI 中实现 MVVM 模式?视图不会重新渲染
SwiftUI:避免使用 MKMapView+UIViewRepresentable 在 TabView 中重新创建/重新渲染视图