Представлять .sheet, когда изображение выбирается из библиотеки фотографий, и передавать изображение в .sheet (SwiftUI + UIImagePicker) - PullRequest
0 голосов
/ 16 марта 2020

Я создаю приложение (в целях обучения), которое напоминает представление App Store сегодня, с ForEach ScrollView (предоставляется моделью array [struct]) следующим образом:

var MirleftCards: [mirleftCard] = [
       mirleftCard(image: Image("beach"), title: "The Beach", description: "Description 1"),
       mirleftCard(image: Image("sea"), title: "The Sea", description: "Description 2"),
   ]

   var body: some View {
       NavigationView{
           ScrollView {
               ForEach(MirleftCards, id: \.id) { card in
                   CardView(card_image: card.image, card_title: card.title, card_description: card.description)
               }
         }
     }
}

Я хочу чтобы иметь возможность добавить свое собственное изображение в ScrollView с его собственным названием и описанием - поэтому я создал новый вид редактора, который будет отображаться модально после выбора изображения из библиотеки фотографий.

class NewCardText: ObservableObject {
    @Published var title = ""
    @Published var description = ""
}

struct NewCardView: View {
    @ObservedObject var newCardText = NewCardText()

    var body: some View {
        NavigationView {
            Image(//chosen image)
                .resizable()
                .scaledToFit()
                .clipShape(RoundedRectangle(cornerRadius: 20))
                .overlay(TextField("Title", text: $newCardText.title).foregroundColor(.white).font(.system(size: 34, weight: .heavy, design: .default)).padding(), alignment: .topLeading)
                .overlay(TextField("Description", text: $newCardText.description).foregroundColor(.white).textFieldStyle(CustomTextFieldStyle()).padding(), alignment: .bottomLeading)
                .padding()
                .padding(.bottom, 150)
            .navigationBarTitle("Add new card")
        }
    }
}

Итак Я нашел соответствующий код UIImagePickerController ( zip ) и соответствующий код для ContentView, который теперь выглядит следующим образом

struct ContentView: View {

    @State var showActionSheet = false
    @State var showImagePicker = false
    @State var sourceType:UIImagePickerController.SourceType = .camera

    @State var image:UIImage?
 var body: some View {
//previous code
.navigationBarItems(trailing:
                Button(action: { self.showActionSheet = true }) {
                    Image(systemName: "folder.fill.badge.plus")
                        .imageScale(.large)
                        .padding()
                        })
            .actionSheet(isPresented: $showActionSheet){
                    ActionSheet(title: Text("Add a picture to your post"), message: nil, buttons: [
                        //Button1

                        .default(Text("Camera"), action: {
                            self.showImagePicker = true
                            self.sourceType = .camera
                        }),
                        //Button2
                        .default(Text("Photo Library"), action: {
                            self.showImagePicker = true
                            self.sourceType = .photoLibrary
                        }),

                        //Button3
                        .cancel()

                    ])
                }.sheet(isPresented: $showImagePicker){
                    imagePicker(image: self.$image, showImagePicker: self.$showImagePicker, sourceType: self.sourceType)
}

Мой вопрос: как я могу вызвать NewCardView (), когда Я выбираю свое изображение и передаю выбранное изображение в модал NewCardView ()?

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

...