当视图出现/消失时,SwiftUI如何在视图内触发操作?
我最近开始涉足当视图出现/消失时,SwiftUI如何在视图内触发操作?,swiftui,Swiftui,我最近开始涉足swiftUI。我注意到的一点是,现在我们可以选择在视图中添加修饰符:.onAppear和.onDisappear,并触发一些操作。但我想做的有些不同,我想在视图出现/消失时触发视图内部的操作 例如,我有视频播放器,每当列表视图从屏幕上滚动时,我想暂停视频(视频嵌入到我的视图中)。反之亦然,我希望视频开始播放。视频播放/暂停的所有逻辑都在视图内 那么,当视图出现/消失时,如何触发操作 下面是我的代码示例: struct ContentView: View { var bod
swiftUI
。我注意到的一点是,现在我们可以选择在视图中添加修饰符:.onAppear
和.onDisappear
,并触发一些操作。但我想做的有些不同,我想在视图出现/消失时触发视图内部的操作
例如,我有视频播放器,每当列表视图从屏幕上滚动时,我想暂停视频(视频嵌入到我的视图中)。反之亦然,我希望视频开始播放。视频播放/暂停的所有逻辑都在视图内
那么,当视图出现/消失时,如何触发操作
下面是我的代码示例:
struct ContentView: View {
var body: some View {
VStack {
List(0..<14) { item in
VideoPreviewView(videoURLString: largeVideos[item])
.frame(height: 375)
.background(Color.red)
.onAppear {
// play video
}
.onDisappear {
// stop video
}
}
}
}
}
struct ContentView:View{
var body:一些观点{
VStack{
列表(0..为了运行onAppear
逻辑,当出现子视图时,只需将.onAppear
函数附加到子视图主体中即可
struct VideoPreviewView: View {
let videoURLString: String
var body: some View {
Text("VideoPreviewView")
.onAppear {
playVideo()
}
.onDisappear {
stopVideo()
}
}
private func playVideo() {
print("Start playing \(videoURLString)")
}
private func stopVideo() {
print("Stop playing \(videoURLString)")
}
}
struct ContentView: View {
let videoUrls = ["1","2","3", "4","5", "6", "7"]
var body: some View {
VStack {
List(videoUrls, id: \.self) { urlString in
LazyVStack {
VideoPreviewView(videoURLString: urlString)
.frame(height: 375)
.background(Color.red)
}
}
}
}
}
在控制台中产生以下输出:
Start playing 1
Start playing 2
Start playing 3
Start playing 4
Start playing 5
Start playing 6
Start playing 7
Stop playing 4
Stop playing 5
Stop playing 6
Stop playing 7
子视图的所有onAppear
方法都被调用,不可见子视图的onDisappear
方法被调用之后。
你可以在这里找到关于发生了什么的讨论:
如果使用ScrollView
+ForEach
+LazyVStack
(这一个很重要)组合,则会得到以下输出:
struct ContentView: View {
let videoUrls = ["1","2","3", "4","5", "6", "7"]
var body: some View {
ScrollView {
ForEach(videoUrls, id: \.self) { urlString in
LazyVStack {
VideoPreviewView(videoURLString: urlString)
.frame(height: 375)
.background(Color.red)
}
}
}
}
}
Start playing 3
Start playing 2
Start playing 1
现在只调用可见的子视图。如果向下滚动,您应该会在控制台中看到所需的输出。这应该适用于您的用例
所有代码都是用Xcode 12.4和iOS 14.4测试和运行的这正是“onAppear”所做的。您可以运行startVideo()(视图中的一个函数)在onAppear中。您还应该提供一个最小的可复制示例。@Ali,我将更新问题您将在VideoPreviewView
视图主体中添加.onAppear
修饰符。实际上,我无法复制您的第二个示例,所有.onAppear都会立即调用,而不仅仅是前三个。您能重新检查吗?进一步测试后,t他的看起来像SwiftUI bug。我将打开关于这个的新线程。我为内容视图添加了完整的代码。重要的是你要使用LazyVStack。