Tio
Tio

Reputation: 1036

How can I use lifecycle methods when a particular view is selected?

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

Answers (1)

Koushik Mudi
Koushik Mudi

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

Related Questions