Как я могу использовать методы жизненного цикла, когда выбрано определенное представление?

#swiftui #swift5

#свифтуи #стремительный 5

Вопрос:

В настоящее время я разрабатываю приложение с использованием SwiftUI.

Это приложение имеет 2 вида, управляемых с помощью вкладки.

Я хочу использовать эти методы sceneDidBecomeActive и sceneWillEnterForeground в SceneDelegate.swift только тогда, когда выбрано определенное представление.

Эти методы работают независимо от того, какой вид выбран.

Как я могу выполнить этот запрос?


Удаление сцены.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) {
    }
}
  

Просмотр содержимого.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()
    }
}
  

Первый просмотр.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: версия 11.7

Swift: Swift 5

Комментарии:

1. SceneDelegate работает до тех пор, пока существует сцена, это зависит от сцены, а не от конкретного представления. Вы можете реагировать на это только в определенном представлении, но вы не можете предотвратить обратные вызовы делегата после создания делегата.

2. @Asperi, спасибо за ваш комментарий, я буду искать другой способ.

Ответ №1:

Методы SceneDelegate касаются жизненного цикла приложения, а не представления. Поэтому вы не можете «запускать» их при выборе представления.

Что вы можете сделать, так это использовать пользовательские ошибки.

 // 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")
    }
}