即使正确刷新视图,为啥 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 不会自动推送下一个控制器?的主要内容,如果未能解决你的问题,请参考以下文章
即使在使用view.setNeedsDisplay()刷新视图后,.isHidden属性也不会反映视图的更改
SwiftUI,为啥部分视图没有刷新? @State 变量未更新