ios - 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 属性,我会得到全新的视图,实际上如果我在进入全屏之前播放视频,我听到它仍然在后台播放。我的全屏视频现在从头开始,而不是从进入全屏之前的位置恢复。
解决方案
问题是AVPlayer
View 更新之间的状态未恢复。一个可能的解决方案是提供AVPlayer
作为参数给您PlayerContainerView
(而不是 url)。
推荐阅读
- python - 我们如何做 R 的扩展函数在 python 中的作用?
- python - 使用元类定义对象实例属性
- python - 如何通过用户输入在 Python 中创建字典
- perl - 在 Perl for 循环中声明我的 $value 导致错误的原因是什么?
- python - Django PasswordResetDoneView 找不到视图或 URL 模式
- firebase - Firestore 规则 > 确定哪个收集/规则失败
- java - Java Map 替换值字符串,如果 Map 包含此值
- php - 我如何在 laravel 中拆分两个用户?
- swiftui - 修复 SwiftUI 中的重叠视图
- php - 获取最近 30 天 DATES dd-mm-yyyy