首页 > 解决方案 > SwiftUI - 更新父视图的状态时如何保留子视图的状态?

问题描述

我试图找到一种方法来在父更新时保留子视图。我有以下设置:

struct VideoPlayerView: View {
       
    @State var fullScreen : Bool = false
    
    var body: some View {
        NavigationView {
            VStack {                
                PlayerContainerView(url: URL(string: "video-link-from-vimeo")!, fullScreen: $fullScreen)
                
                if !fullScreen {                    
                    VStack {
                        ...very long content here...
                    }                          
                }
            }
            .backgroundColor(self.fullScreen ? K.Colors.AppText : K.Colors.AppBackground)
            .hideNavigationBar()
        }
        .hideNavigationBar()
    }
}

PlayerContainerView 只是我的包装器,包含 AVPlayer 和一些自定义控件。为了首先显示播放器,我使用了本官方 SwiftUI 教程第 5 节中的这项技术(如果相关)。

我正在加载的视频来自 Vimeo。fullScreen @State 属性正在从子视图中更新。

想要的结果

我希望能够隐藏播放器下方的所有内容,以便播放器随后全屏显示。这可能在任何时候发生 - 即当视频已经在播放时,当视频在特定时间暂停时等。

问题

问题是,如果我更新 fullScreen @State 属性,我会得到全新的视图,实际上如果我在进入全屏之前播放视频,我听到它仍然在后台播放。我的全屏视频现在从头开始,而不是从进入全屏之前的位置恢复。

标签: iosswiftxcodeswiftuiavplayer

解决方案


问题是AVPlayerView 更新之间的状态未恢复。一个可能的解决方案是提供AVPlayer作为参数给您PlayerContainerView(而不是 url)。


推荐阅读