即使正确刷新视图,为啥 NavigationLink 不会自动推送下一个控制器?

Posted

技术标签:

【中文标题】即使正确刷新视图,为啥 NavigationLink 不会自动推送下一个控制器?【英文标题】:Why is NavigationLink not pushing the next controller automatically even if the view is refreshed correctly?即使正确刷新视图,为什么 NavigationLink 不会自动推送下一个控制器? 【发布时间】:2020-01-02 16:53:26 【问题描述】:

我有这样的观点,即向用户请求照片权限,当这些权限被授予时,我想推送下一个控制器。我正在尝试这样,但它不会自动推送。 有什么帮助吗?

顺便说一句,这是正确编译并且正在工作。向用户正确请求权限并刷新视图,但它并没有像我预期的那样推送下一个控制器。

这是我用来请求权限的助手:

class PhotosLibraryHelper : ObservableObject
    static let shared = PhotosLibraryHelper()

    @Published var authorizationStatus = phphotoLibrary.authorizationStatus()

    @Published var requestingAuthorization = false

    @Published var authorized = PHPhotoLibrary.authorizationStatus() == .authorized

    func requestAuthorization()
        self.requestingAuthorization = true
        PHPhotoLibrary.requestAuthorization  (authorizationStatus) in
            DispatchQueue.main.async 
                self.authorized = authorizationStatus == .authorized ? true : false
                self.authorizationStatus = authorizationStatus
                self.requestingAuthorization = false
            
        
    

这是我正在使用的视图的一部分:

struct PhotosPermissionView : View 

    @ObservedObject var photosLibraryHelper = PhotosLibraryHelper.shared

    @State var authorized = PhotosLibraryHelper.shared.authorized

    var body: some View 
....        
            ctaButton()

            NavigationLink(destination: ProductsView(), isActive: $authorized) 
                EmptyView()
            
....
    

    func ctaButton() -> AnyView 
        if (photosLibraryHelper.requestingAuthorization)
            return AnyView(CTAButton(loading:true))
        else
            switch photosLibraryHelper.authorizationStatus 
            case .authorized:
                return AnyView(NavigationLink(destination: ProductsView())
                    CTAButton(title:"CONTINUE")
                )
            case .denied,
                 .restricted:
                return AnyView(NavigationLink(destination: PhotosPermissionView())
                    CTAButton(title:"SETTINGS")
                )
            case .notDetermined:
                return AnyView(
                    Button(action: 
                        self.photosLibraryHelper.requestAuthorization()
                    ) 
                        CTAButton(title:"REQUEST")
                    
                )
            @unknown default:
                return AnyView(NavigationLink(destination: PhotosPermissionView())
                    CTAButton(title:"CONTINUE")
                )
            
        
    

【问题讨论】:

【参考方案1】:

这个

@State var authorized = PhotosLibraryHelper.shared.authorized

只是初始值设置,以后任何地方都不会改变。

实际上你不需要本地状态。导航链接可以直接绑定到 helper 的发布属性

NavigationLink(destination: ProductsView(), isActive: $photosLibraryHelper.authorized) 
    EmptyView()

【讨论】:

这可行,但作为澄清,我正在更改 photoslibraryhelper 类中已发布属性的值。为什么不影响视图的状态属性? 因为初始赋值是不绑定的,只是设置了初始值,以后需要在某处改变状态才能生效。

以上是关于即使正确刷新视图,为啥 NavigationLink 不会自动推送下一个控制器?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 为啥我必须在表更改后刷新视图

即使在使用view.setNeedsDisplay()刷新视图后,.isHidden属性也不会反映视图的更改

即使清除缓存 laravel 后视图也不刷新

SwiftUI,为啥部分视图没有刷新? @State 变量未更新

即使不将其添加为子视图,设置为 TableViewController 的刷新控件也可以工作

为啥滚动视图即使没有 contentView 滚动到仍然滚动