当视图出现/消失时,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。