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
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
}