ios - 自动选择 SwiftUI 中的第 0 个项目

标签 ios foreach scrollview swiftui hstack

我已将数据加载到 HStackScroll View 中在 SwiftUI .现在我已经对其进行了编码,用户可以在其中点击这些项目之一并选择它。我希望在加载时已经选择了第 0 个项目。

import SwiftUI
import Combine
import Contentful

struct moviesView : View {

    @ObservedObject var fetcher = MovieFetcher()

    @State var selectMovie: Movie? = nil

    @Binding var show: Bool

    var body: some View {
        HStack(alignment: .bottom) {
            if show {
                ScrollView(.horizontal) {
                    Spacer()

                    HStack(alignment: .bottom, spacing: 30) {
                        ForEach(fetcher.movies, id: \.self) { item in
                            selectableRow(movie: item, selectMovie: self.$selectMovie)
                        }
                        .onAppear() {
                            self.selectMovie = self.movies.count > 0 ? self.movies.first! : nil
                        }
                    }
                    .frame(minWidth: 0, maxWidth: .infinity)
                }
                .padding(.leading, 46)
                .padding(.bottom, 26)
            }
        }
    }
}

struct selectableRow : View {

    var movie: Movie

    @Binding var selectedMovie: Movie?

    @State var initialImage = UIImage()

    var body: some View {
        ZStack(alignment: .center) {
            if movie == selectedMovie {
                Image("")
                .resizable()
                .frame(width: 187, height: 254)
                .overlay(
                    RoundedRectangle(cornerRadius: 13)
                Image(uiImage: initialImage)
                .resizable()
                .cornerRadius(13.0)
                .frame(width: 182, height: 249)
                .onAppear {
                    let urlString = "\(urlBase)\(self.movie.movieId).png?"
                    guard let url = URL(string: self.urlString) else { return }
                    URLSession.shared.dataTask(with: url) { (data, response, error) in
                        guard let data = data else { return }
                        guard let image = UIImage(data: data) else { return }

                        RunLoop.main.perform {
                            self.initialImage = image
                        }

                    }.resume()
                }
            } else {
                Image(uiImage: initialImage)
                .resizable()
                .cornerRadius(13.0)
                .frame(width: 135, height: 179)
                .onAppear {
                   let urlString = "\(urlBase)\(self.movie.movieId).png?"
                   guard let url = URL(string: self.urlString) else { return }
                    URLSession.shared.dataTask(with: url) { (data, response, error) in
                        guard let data = data else { return }
                        guard let image = UIImage(data: data) else { return }

                        RunLoop.main.perform {
                            self.initialImage = image
                        }

                    }.resume()
                }
            }
        }
        .onTapGesture {
            self.selectedMovie = self.movie
        }
    }
}

编辑:

我添加了以下建议,但它现在仍然可以正常工作。也许这是我添加 .onAppear 的地方?

因此,当我启动我的应用程序时,我看到第 0 个项目被选中,但是当我点击任何项目时, View 只会重新加载,但第 0 个项目始终保持选中状态。

附加问题:

另外,我的@ObservedObject var fetcher = MovieFetcher()moviesView被反复调用。

最佳答案

由于您没有提供完整的工作代码,因此我无法重现您提到的问题。但是,我建议您将 .onAppear 从 ForEach 移动到 HStack(参见下面的代码)。

我无法重现您指定的问题。

var body: some View {
    HStack(alignment: .bottom) {
        if show {
            ScrollView(.horizontal) {
                Spacer()

                HStack(alignment: .bottom, spacing: 30) {
                    ForEach(fetcher.movies, id: \.self) { item in
                        selectableRow(movie: item, selectedMovie: self.$selectMovie)
                    }
                }
                .frame(minWidth: 0, maxWidth: .infinity)
            }
            .padding(.leading, 46)
            .padding(.bottom, 26)
            .onAppear() {
                self.selectMovie = self.fetcher.movies.count > 0 ? self.fetcher.movies.first! : nil
            }
        }
    }
}

在 struct moviesView 中,使用以下代码自动选择第一部电影。
.onAppear() {
    self.selectMovie = self.movies.count > 0 ? self.movies.first! : nil
}

如果您还有其他问题,请告诉我。

关于ios - 自动选择 SwiftUI 中的第 0 个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60664122/

相关文章:

ios - ios-在WkWebView中禁用Youtube自动播放

ios - 范围不正确

ios - 快速打开文件

java - 使用 for each 循环在数组列表中查找两个元素

ios - 如何将 NSAttributedString 绑定(bind)到 UITextView

javascript - ES6 循环和 forEach 中的上下文和变量作用域

arrays - Powershell foreach(列出引用的数组项命令)

wpf - 滚动/适合带有复选框的图像

ios - scrollview 在访问 View Controller 的最后一个组件时向上滚动

android - ScrollView 内部没有释放动力