То же изображение, показываемое при показе модального с помощью .sheet после повторения массива - PullRequest
0 голосов
/ 14 января 2020

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

Основной вид:

   if documents.count > 0 {
        ScrollView(.horizontal, showsIndicators: true) {
            HStack {
                ForEach(documents, id: \.self.id) {(doc: Document) in
                    Image(uiImage: UIImage(data: doc.image)!)
                    .resizable()
                    .frame(width: 40, height: 50, alignment: .center)
                    .clipShape(Rectangle())
                    .cornerRadius(8)
                    .scaledToFit()
                    .onTapGesture {
                        self.showImageDetail = true

                    }
                    .padding(.all, 5)
                    .sheet(isPresented: self.$showImageDetail, content: {
                        ImageViewDetail(image: UIImage(data: doc.image)!)
                    })
                }
            }
        }
    } 

Когда отображается ImageDetailView, всегда сохраняется самое последнее изображение. Ниже приведен подробный вид кода:

import SwiftUI
struct ImageViewDetail: View {
    @Environment(\.presentationMode) var presentationMode
    @State var image: UIImage
    @State var scale: CGFloat = 1.0

    var body: some View {
        VStack {
            Image(uiImage: image)
                .resizable()
                .padding()
                .scaledToFit()
                .scaleEffect(scale)
                .cornerRadius(8)
                .gesture(MagnificationGesture()
                    .onChanged {value in
                        self.scale = value.magnitude
                    }
                )

            HStack {
                Button("Back") {
                    self.presentationMode.wrappedValue.dismiss()
                }
                .buttonStyle(FillStyle(width: 86, height: 32))
                .padding(.trailing, 10)

                Button("Delete") {

                }
                .buttonStyle(FillStyle(width: 86, height: 32))
                .padding(.leading, 10)
            }
        }
        .navigationBarTitle("Image", displayMode: .inline)
    }
}

Любая помощь будет принята с благодарностью - я не могу понять, почему нужное изображение не отображается в ImageDetailView? Большое спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Лист может быть только одним в иерархии представлений, поэтому ниже он перемещается на HStack, и необходимо добавить элемент currentImage

Вот неуклюжий подход ... (не проверено - может быть нужно позаботиться об опциях)

@State private var currentImage: UIImage = UIImage() // < needed optionals?
...

ScrollView(.horizontal, showsIndicators: true) {
    HStack {
        ForEach(documents, id: \.self.id) {(doc: Document) in
            Image(uiImage: UIImage(data: doc.image)!)
            .resizable()
            .frame(width: 40, height: 50, alignment: .center)
            .clipShape(Rectangle())
            .cornerRadius(8)
            .scaledToFit()
            .onTapGesture {
                self.currentImage = UIImage(data: doc.image) ?? UIImage() // < current
                self.showImageDetail = true
            }
            .padding(.all, 5)
        }
    }
    .sheet(isPresented: self.$showImageDetail, content: { // < one sheet
                ImageViewDetail(image: self.currentImage)
            })
}
0 голосов
/ 14 января 2020

Заменить состояние Bool на состояние Document?:

@State var selectedDocument: Document?

var body: some View {
    HStack {
        ForEach(documents, id: \.self.id) {(doc: Document) in
            Image(uiImage: UIImage(data: doc.image)!)
                .onTapGesture {
                    self.selectedDocument = doc
                }
            }
        }
    }
    .sheet(item: $selectedDocument) {
        ImageViewDetail(image: UIImage(data: $0.image)!)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...