Reputation: 1036
I'm currently developing an application using SwiftUI.
This app has 2 Views controlled a Tab View.
I want to use these methods sceneDidBecomeActive
and sceneWillEnterForeground
in SceneDelegate.swift
only when a particular view is selected.
These methods work irrespective of which view is selected.
How can I do this request?
SceneDelegate.swift
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
func sceneDidDisconnect(_ scene: UIScene) {
}
func sceneDidBecomeActive(_ scene: UIScene) {
// I want use this print method only when FirstView is selected
print("selected FirstVIew")
}
func sceneWillResignActive(_ scene: UIScene) {
}
func sceneWillEnterForeground(_ scene: UIScene) {
// I want use this print method only when FirstView is selected
print("selected FirstVIew")
}
func sceneDidEnterBackground(_ scene: UIScene) {
}
}
ContentView.swift
import SwiftUI
struct ContentView: View {
var body: some View {
TabView {
FirstView()
.tabItem {
Text("First")
}.tag(1)
SecondView()
.tabItem {
Text("Second")
}.tag(2)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
FirstView.swift
import SwiftUI
struct FirstView: View {
var body: some View {
Text("FirstView")
}
}
struct FirstView_Previews: PreviewProvider {
static var previews: some View {
FirstView()
}
}
SecondView.swift
import SwiftUI
struct SecondView: View {
var body: some View {
Text("SecondView")
}
}
struct SecondView_Previews: PreviewProvider {
static var previews: some View {
SecondView()
}
}
Xcode: Version 11.7
Swift: Swift 5
Upvotes: 0
Views: 126
Reputation: 193
SceneDelegate methods deal with App's life cycle, not a view's. Therefore you cannot "run" them when a view is selected.
What you can do though is use UserDefaults.
// When first view selected
UserDefaults.standard.set("First View", forKey: "selectedView")
// In SceneDelegate
func sceneDidBecomeActive(_ scene: UIScene) {
if let selected = UserDefaults.standard.string(forKey: "selectedView"),
selected == "First View" {
print("selected FirstVIew")
}
}
func sceneWillEnterForeground(_ scene: UIScene) {
if let selected = UserDefaults.standard.string(forKey: "selectedView"),
selected == "First View" {
print("selected FirstVIew")
}
}
Upvotes: 1