【发布时间】:2021-11-19 10:32:26
【问题描述】:
我想知道是否有一种方法可以在 forEach 函数完成事件上执行给定代码(如 OnAppear 或苹果提供的类似方法),如果没有可用的方法,我如何在 ForEach 完成时执行代码。
我有以下代码:
ScrollView {
ScrollViewReader { value in
VStack {
let tweets = getFilteredTweets()
ForEach((0..<tweets.count), id: \.self) { index in
NavigationLink(destination: TweetWebView(
tweetId: tweets[index].id,
accountId: self.viewModel.viewState.selectedAccounts.first(where: {
$0.screenName == tweets[index].screenName
})?.screenName?.lowercased()
)) {
VStack {
TweetView(
style: .withNoImage,
withHeight: true,
account: self.viewModel.viewState.selectedAccounts.first(where: {
$0.screenName == tweets[index].screenName
}),
tweet: tweets[index]
)
.frame(maxHeight: .infinity)
.onTapGesture {
viewModel.triggerEvent(.setTweetSelectedIndex(index: index))
}
}
}
.buttonStyle(PlainButtonStyle())
}
.onAppear {
value.scrollTo(viewModel.viewState.tweetSelectedIndex ?? 0)
}
}
}
}
我要在事件 ForEach 完成时执行的代码:
value.scrollTo(viewModel.viewState.tweetSelectedIndex ?? 0)
【问题讨论】:
-
回答你的问题,没有。然而,这需要一个Minimal, Reproducible Example,但你可能会在
scrollTo周围有一个DispatchQueue.main.asyncAfter(deadline:)。你没有说实际发生了什么,但我怀疑你的scrollTo没有像你预期的那样滚动。我认为你在这里有一个 XY 问题。你想做 X,你认为 Y 是解决方案。你不能让 Y 工作,所以当你真的想解决 X 时,你发布关于 Y 的信息。Y 是在ForEach完成后运行代码。 -
最后是主观的。 for each 不一定会一次加载所有对象。有许多因素会影响预加载的项目数量。需要考虑的事情是反转数组。在顶部为您提供最新信息。
标签: ios swift swiftui swiftui-foreach