我目前正在使用 SwiftUI 开发一个应用程序。
我想在视图出现时使用一种方法。
对于我在下面附加的代码,我可以print
在应用程序启动并在页面之间进行一些转换时使用该方法。
print
但我想在重新打开应用程序时使用该方法,如下所示:
1:在模拟器上运行代码(我可以看到该print
方法有效)。
2:按主页按钮。
3:点击应用程序图标打开应用程序(我看不到该print
方法有效)。
(*) 我想使用print
这里的方法。
在这种情况下我怎样才能做到我想要的呢?
这是代码:
import SwiftUI
struct ContentView: View {
@State private var selection = 0
var body: some View {
TabView(selection: $selection){
Text("First View")
.onAppear(){
print("First")
}
.tabItem {
Text("First")
}
.tag(0)
Text("Second View")
.tabItem {
Text("Second")
}
.tag(1)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Run Code Online (Sandbox Code Playgroud)
添加:
当应用程序从后台变成前台时,我找到了一种使用某些功能的方法,使用sceneWillEnterForeground
或sceneWillResignActive
SceneDelegate.swift
但在这种情况下,当应用程序成为前台时,SecondView 也可以工作。我想修改代码以仅当应用程序成为 FirstView 的前台时才运行该功能。
有什么办法可以做到这一点吗?
SceneDelegate.swift
func sceneDidBecomeActive(_ scene: UIScene) {
print("BecomeActive")
}
func sceneWillEnterForeground(_ scene: UIScene) {
print("Foreground")
}
Run Code Online (Sandbox Code Playgroud)
Xcode:版本 11.7
斯威夫特:斯威夫特 5
您可以使用@EnvironmentObject
来跟踪应用程序状态(通过观察通知):
class AppState: ObservableObject {
@Published var isActive = true
private var observers = [NSObjectProtocol]()
init() {
observers.append(
NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { _ in
self.isActive = true
}
)
observers.append(
NotificationCenter.default.addObserver(forName: UIApplication.willResignActiveNotification, object: nil, queue: .main) { _ in
self.isActive = false
}
)
}
deinit {
observers.forEach(NotificationCenter.default.removeObserver)
}
}
Run Code Online (Sandbox Code Playgroud)
您需要在 SceneDelegate 中创建它(仅一次)并将其作为以下内容传递给 ContentView @EnvironmentObject
:
let appState = AppState()
let contentView = ContentView().environmentObject(appState)
Run Code Online (Sandbox Code Playgroud)
现在您可以@EnvironmentObject
在任何您想要的视图中使用:
struct FirstView: View {
@EnvironmentObject var appState: AppState
var body: some View {
Text("First View, isActive: \(appState.isActive.description)")
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4036 次 |
最近记录: |