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