SwiftUI确定初始视图

成长34

我试图弄清楚我在SwiftUI生命周期中制作的应用程序的导航。根据启动时确定的设置,用户可以从三个视图之一开始。如果用户从推送通知中打开应用程序,则他们应该看到视频视图(WrappedVideoViewController)。否则,如果他们已经登录,则应该看到“主页”视图,否则,应该看到“登录”视图。我使用ContentView作为父项:

import SwiftUI

struct ContentView: View {
    @EnvironmentObject var notifService: NotificationService
    @EnvironmentObject var authState: AuthenticationState
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
        
    @ObservedObject var viewRouter: ViewRouter
    
    init() {
        self.viewRouter = ViewRouter.shared
    }
    
    var body: some View {
        
        print("in ContentView body")
        
        switch viewRouter.currentScreen {
        case .home:
            print("home")
            return AnyView(Home(innerGradientColor: Color.homeActiveInner, outerGradientColor: Color.homeActiveOuter))
        case .login:
            print("login")
            return
                AnyView(Login()
                .environmentObject(AuthenticationState.shared))
        case .video:
            print("video")
            return AnyView(WrappedVideoViewController())

        }
            
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(AuthenticationState.shared)
            .environmentObject(NotificationService())
    }
}

我的ViewRouter类是一个ObservableObject,用于控制显示哪个屏幕。目前,我有这个:

//
//  NavigationState.swift
//  BumpCall-SwiftUI
//
//  Created by Ben on 1/22/21.
//

import Foundation
import SwiftUI

enum Screen {
    case home
    case video
    case login
}

class ViewRouter: ObservableObject {
    
    var authState: AuthenticationState
    var notifService: NotificationService
    
    static var shared = ViewRouter(authState: AuthenticationState.shared, notifService: NotificationService.shared)
    
    init(authState: AuthenticationState, notifService: NotificationService) {
        self.authState = authState
        self.notifService = notifService
        
        if notifService.dumbData != nil {
            currentScreen = .video
        } else if (notifService.dumbData == nil && authState.isLoggedIn()) {
            currentScreen = .home
        } else {
            currentScreen = .login
        }
        
    }
    
    @Published var currentScreen: Screen
    
}

这很棘手,因为ViewRouter依赖于其他两个ObservableObjects,我正在尝试使用init()处理它。看来AuthenticationState类工作正常,因为打开应用程序后,如果您登录了,它确实会将您发送到主屏幕。但是,从通知中打开也会将我发送到主屏幕。NotificationService在didReceive响应中更改ViewRouter单例:方法:

class NotificationService: NSObject, ObservableObject {
    @Published var dumbData: UNNotificationResponse?
    
    static var shared = NotificationService()
    
    override init() {
        super.init()
        UNUserNotificationCenter.current().delegate = self
    }
}

extension NotificationService: UNUserNotificationCenterDelegate  {
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("presenting notification")
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        ViewRouter.shared.notifService.dumbData = response
        print("Notification service didReceive response")
        completionHandler()
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { }
    
}

但是单例不得更新,以使ContentView注意到。这太令人费解了,已经使我困惑了好几天,任何帮助将不胜感激。

达维杰夫

问题是ViewRouter init()将被调用一次。如前所述,当用户登录时,currentScreen将初始化为.home但是,此变量以后将永远不会更改。

你基本上要,什么是一套currentScreen.video通知委托内。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    ViewRouter.shared.currentScreen = .video //<< here set video 
    print("Notification service didReceive response")
    completionHandler()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SwiftUI视图在初始拖动时跳转

来自分类Dev

通知视图在swiftUI中单击警报确定按钮

来自分类Dev

使用SwiftUI的For Each确定要添加到列表的视图

来自分类Dev

如何为swiftUI设置初始视图控制器

来自分类Dev

在swiftUI中初始化详细信息视图

来自分类Dev

我如何确定一个视图在SwiftUI的最后一行代码之前完全呈现?

来自分类Dev

SwiftUI EnvironmentObject在视图初始化程序中不可用?

来自分类Dev

SwiftUI:如何根据视图中的另一个变量初始化变量

来自分类Dev

在变更函数和初始化程序中更改时,@ State无法更新SwiftUI视图

来自分类Dev

对主体的怪异初始化语法感到好奇:SwiftUI中ContentView中的某些视图

来自分类Dev

UITabbarController设置初始视图

来自分类Dev

SwiftUI-我可以为通用视图定义一个空的初始化程序吗?

来自分类Dev

SwiftUI视图,在所有存储的属性初始化之前使用struct成员初始化闭包说>'self'<

来自分类Dev

SwiftUI从视图传递参数

来自分类Dev

在SwiftUI中堆叠视图

来自分类Dev

SwiftUI视图不会更新

来自分类Dev

隐藏的Swiftui进度视图

来自分类Dev

NavigationLink视图参数SwiftUI

来自分类Dev

确定显示的条目是列表视图

来自分类Dev

如何设置初始视图属性?

来自分类Dev

在AppKit视图中嵌入SwiftUI视图

来自分类Dev

SwiftUI视图和UIKit视图的Z索引

来自分类Dev

弹出视图可推送当前视图SwiftUI

来自分类Dev

SwiftUI:从另一个初始化程序调用它时,如何使我的闭包返回“内容”而不是“某些视图”?

来自分类常见问题

从其中重新加载SwiftUI视图

来自分类Dev

在SwiftUI视图中解包可选

来自分类Dev

字典列表以列出视图SwiftUI

来自分类Dev

SwiftUI视图以蓝色背景显示

来自分类Dev

在SwiftUI中提取视图属性

Related 相关文章

  1. 1

    SwiftUI视图在初始拖动时跳转

  2. 2

    通知视图在swiftUI中单击警报确定按钮

  3. 3

    使用SwiftUI的For Each确定要添加到列表的视图

  4. 4

    如何为swiftUI设置初始视图控制器

  5. 5

    在swiftUI中初始化详细信息视图

  6. 6

    我如何确定一个视图在SwiftUI的最后一行代码之前完全呈现?

  7. 7

    SwiftUI EnvironmentObject在视图初始化程序中不可用?

  8. 8

    SwiftUI:如何根据视图中的另一个变量初始化变量

  9. 9

    在变更函数和初始化程序中更改时,@ State无法更新SwiftUI视图

  10. 10

    对主体的怪异初始化语法感到好奇:SwiftUI中ContentView中的某些视图

  11. 11

    UITabbarController设置初始视图

  12. 12

    SwiftUI-我可以为通用视图定义一个空的初始化程序吗?

  13. 13

    SwiftUI视图,在所有存储的属性初始化之前使用struct成员初始化闭包说>'self'<

  14. 14

    SwiftUI从视图传递参数

  15. 15

    在SwiftUI中堆叠视图

  16. 16

    SwiftUI视图不会更新

  17. 17

    隐藏的Swiftui进度视图

  18. 18

    NavigationLink视图参数SwiftUI

  19. 19

    确定显示的条目是列表视图

  20. 20

    如何设置初始视图属性?

  21. 21

    在AppKit视图中嵌入SwiftUI视图

  22. 22

    SwiftUI视图和UIKit视图的Z索引

  23. 23

    弹出视图可推送当前视图SwiftUI

  24. 24

    SwiftUI:从另一个初始化程序调用它时,如何使我的闭包返回“内容”而不是“某些视图”?

  25. 25

    从其中重新加载SwiftUI视图

  26. 26

    在SwiftUI视图中解包可选

  27. 27

    字典列表以列出视图SwiftUI

  28. 28

    SwiftUI视图以蓝色背景显示

  29. 29

    在SwiftUI中提取视图属性

热门标签

归档