Search code examples
swiftuicellincrement

Fetch ScrollView Element Number SwiftUI


I want to change ArticleListElementView according to the number of the cell. Such as I have 10 cells in ScrollView and if the cell number is odd as 1 3 5 7 9 show Rectangle() if the cell number is even as 0 2 4 6 8 hide the Rectangle(). So I thought I can increment my cellNumber var by 1 in ForEach() but it gives me an error. So how can I do this?

struct ArticleView: View {
@ObservedObject var service = ArticleService()
var cellNumber: Int = 0
var body: some View {
ScrollView(.vertical, showsIndicators: false) {
                        LazyVGrid(columns: columns, spacing:0) {
                            ForEach(service.articlePost, id: \.article_id) { post in
                                ArticleListElementView(articlePost: post)
                                    .onTapGesture {
                                        self.shown = true
                                        self.selectedArticle = post
                                    }
                                cellNumberRead()
                            }
                        }
                     }
                   }

func cellNumberRead() {
        cellNumber = cellNumber + 1
    }

struct ArticleListElementView: View {
    var articlePost: ArticlePost
    var body: some View {
        ZStack{
            Color("Background")
                .edgesIgnoringSafeArea(.all)
            HStack {
                //                if articlePost.cellNumber == I want to check cellNumber in here and draw a line else do not draw rectangle
                Rectangle()
                    .frame(width: 0.5, height: width)
        }

Here is the error

enter image description here


Solution

  • You can enumerate data and inject index right into row view, like

    ForEach(Array(service.articlePost.enumerated()), id: \.1.article_id) { i, post in
        ArticleListElementView(articlePost: post, cellNumber: i)   // << here !!
    

    and now use inside ArticleListElementView as needed

    struct ArticleListElementView: View {
        var articlePost: ArticlePost
        var cellNumber: Int
    
        var body: some View {
            ZStack{
                Color("Background")
                    .edgesIgnoringSafeArea(.all)
                HStack {
                    if cellNumber % 2 == 0 {
                       // .. your code
                    } else {
                       // .. another case
                    }