Получить значение индекса при использовании ForEach - SwiftUI - PullRequest
0 голосов
/ 10 февраля 2020

Проблема

Я отображаю список данных, используя оператор ForEach, когда пользователь взаимодействует с каждым видом, размер изменяется и отображается в полноэкранном режиме, проблема заключается в Состояние изменяет размер каждого вида, а не только выбранного. Попытка скопировать карточки домашней страницы App Store.

Что я пытаюсь

Я подумал, может быть, используя значение индекса, я мог бы

 ForEach(objects.indices, id: \.self) { index in
          ObjectView(home: self.objects[index], showContent: self.$showContent)
 } 

А потом, возможно, сохранить значение индекса, тогда только изменить размер, если индекс объекта соответствует сохраненному значению индекса. Однако при попытке использовать индексы я получаю следующую ошибку:

Ошибка: неоднозначная ссылка на «индексы» члена

Полный код:

struct Object: Identifiable {
    var id = UUID()
    var title: String
    var subtitle: String
    var show = false // Maybe set this to true when tapped then use self.objects[index].show for Fram size, but not sure how to get index or make this work
}

struct AppView: View {

    @EnvironmentObject var session: SessionStore
    @Binding var showContent: Bool


        var body: some View {
        ScrollView(.vertical, showsIndicators: false){
            VStack() {
                VStack(alignment: .center, spacing: 32) {
                    ForEach(objectData, id: \.id) { item in
                        GeometryReader { geometry in

                            ContentView(object: item, showContent: self.$showContent)

                            .offset(y: self.showContent ? -geometry.frame(in: .global).minY : 0)

                        }
                        .frame(height: self.showContent ? screen.height : 464)
                        .frame(maxWidth: self.showContent ? .infinity : screen.width - 40)
                    }
                }.offset(x: 0, y: -80)

            }.padding(.bottom, 300)
            .animation(.spring(response: 0.5, dampingFraction: 0.6, blendDuration: 0))

        }.edgesIgnoringSafeArea(.all)
        }
}


struct ObjectCardView: View {

var object: Object
@Binding var showContent:Bool


    var body: some View {
    VStack(alignment: .leading, spacing: 0) {
        ScrollView(.vertical, showsIndicators: false) {

                    Image(object.image)
                        .resizable()
                        .aspectRatio(contentMode: .fill)
                        .frame(height: self.showContent ? 364 : 284)
                        .clipped()       
                        .onTapGesture {
                            self.session.selectedObject = self.object
                            self.showContent.toggle()
                        }

                        if showContent {
                         VStack {
                              DetailsView(object: Object)
                          }
                        }


          }

     }
 }

PS: у меня есть проблема, связанная с представлением, которое заключается в том, что дочернее представление прокрутки изменяет родительское представление прокрутки, и касание дочернего элемента фактически взаимодействует с содержимым в родительском элементе. Поэтому, если я открою карточку и прокручиваю ее, затем коснусь, представление прокрутки AppView также прокрутит и откроет / закроет другие карточки.

1 Ответ

0 голосов
/ 10 февраля 2020
let arr = [String](repeating: "row", count: 10)

.....

ForEach(arr.indices) { i in
    Text(self.arr[i] + "\(i)")
}

Почему ?? var indices: Range<Int> { get } это тип Range<Int>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...