SwiftUI:上传图像并将其放入列表

SwiftUI:上传图像并将其放入列表,swift,swiftui-list,Swift,Swiftui List,我正在尝试构建一个应用程序,用户可以在其中插入电影的名称、添加日期、导演是谁,并可以从照片库直接将图像添加到应用程序中(使用UIKit。谢天谢地,用户可以从照片库中插入文本和图像的部分起作用。我的问题是将数据从.sheet传输到列表中。用户插入的文本字段中的信息工作正常,并显示在列表中,但图像不显示。我一直收到错误消息“无法将'ImagePickerView'类型的值转换为预期的参数类型'String'。我不知道如何解决此问题。当我尝试插入图像()时,此问题出现在MovieRow结构的Conte

我正在尝试构建一个应用程序,用户可以在其中插入电影的名称、添加日期、导演是谁,并可以从照片库直接将图像添加到应用程序中(使用UIKit。谢天谢地,用户可以从照片库中插入文本和图像的部分起作用。我的问题是将数据从.sheet传输到列表中。用户插入的文本字段中的信息工作正常,并显示在列表中,但图像不显示。我一直收到错误消息“无法将'ImagePickerView'类型的值转换为预期的参数类型'String'。我不知道如何解决此问题。当我尝试插入图像()时,此问题出现在MovieRow结构的ContentView.swift文件中。如有任何帮助,将不胜感激。提前感谢。”。 下面是我的ContentView文件

//
//  ContentView.swift
//  MovieListEditttt
//
//  Created by Leandro Gamarra on 5/31/21.
//

import SwiftUI

struct ContentView: View {

@State var movieAdd: [MovieAdd] = []

@State private var newMovieName: String = ""
@State private var newMovieYear: String = ""
@State private var newMovieDirector: String = ""
@State private var newMovieLanguage: String = ""
@State private var newDateAdded: String = ""
@State private var newMovieRating: String = ""
@State private var newHomeOrTheatre: String = ""
@State private var showNewMovie = false

@State private var newMovieImage = UIImage()

var body: some View {
    ZStack {
        VStack {
            HStack {
                Text("Movies Watched Ratings")
                    .font(.system(size: 40, weight: .black, design: .rounded
                    ))
                
                Spacer()
                
                Button(action: {
                    self.showNewMovie = true
                }) {
                    Image(systemName: "plus.circle.fill")
                        .font(.largeTitle)
                        .foregroundColor(.yellow)
                }
                
            }
            .padding()
            
            List{
                ForEach(movieAdd) {movie in
                    movieRow(movieAdd: movie)
                }
            }
        }
        .rotation3DEffect(Angle(degrees: showNewMovie ? 5 : 0), axis: (x: 1, y: 0, z: 0))
        .offset(y: showNewMovie ? -50 : 0)
        .animation(.easeOut)
        
        if movieAdd.count == 0 {
            NoDataView()
        }
        
        if showNewMovie {
            BlankView(bGColor: .black)
                .opacity(0.5)
                .onTapGesture {
                    self.showNewMovie = false
                }
            NewMovieView(isShow: $showNewMovie, addMovie: $movieAdd, newMovieName: newMovieName)
                .transition(.move(edge: .bottom))
                .animation(.interpolatingSpring(stiffness: 200.0, damping: 25.0, initialVelocity: 10.0))
        }
    }
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
    ContentView()
}
}

struct movieRow: View {

@ObservedObject var movieAdd : MovieAdd

var body: some View {
        VStack {
            
            Image("\(movieAdd.movieImage)")
                .resizable()
                .frame(width: 100, height: 100)
            
            Text(movieAdd.movieName)
        
            Text(movieAdd.movieYear)
        
            Text(movieAdd.movieDirector)
        
            Text(movieAdd.homeOrTheatre)
        
            Text(movieAdd.movieLanguage)
        
            Text(movieAdd.movieRating)
        
            Text(movieAdd.dateAdded)
        }
}
}

struct NoDataView: View {
var body: some View {
    Image(systemName: "trash")
        .resizable()
        .scaledToFit()
}
}

struct BlankView: View {
var bGColor: Color

var body: some View {
    VStack {
        Spacer()
    }
    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
    .background(bGColor)
    .edgesIgnoringSafeArea(.all)
}
}
这是我的MovieAdd文件,我在其中初始化所有将放入列表中的变量

import Foundation

class MovieAdd: ObservableObject, Identifiable {
var id = UUID()
@Published var movieName = ""
@Published var movieYear = ""
@Published var movieDirector = ""
@Published var movieLanguage = ""
@Published var dateAdded = ""
@Published var movieRating = ""
@Published var homeOrTheatre = ""
@Published var isComplete : Bool = false
@Published var movieImage : ImagePickerView

init(movieName: String, movieYear: String, movieDirector: String, movieLanguage: String, dateAdded: String, movieRating: String, homeOrTheatre: String, isComplete: Bool = false, movieImage: ImagePickerView) {
    self.movieName = movieName
    self.movieYear = movieYear
    self.movieDirector = movieDirector
    self.movieLanguage = movieLanguage
    self.dateAdded = dateAdded
    self.movieRating = movieRating
    self.homeOrTheatre = homeOrTheatre
    self.isComplete = isComplete
    self.movieImage = movieImage
}
}
这是我的NewMovieView文件,用户可以在其中将他们的电影信息插入文本字段,并从他们的照片库中插入图像。这也是我使用UIKit的地方

import SwiftUI

struct NewMovieView: View {

@Binding var isShow: Bool
@Binding var addMovie: [MovieAdd]

@State var newMovieName: String = ""
@State var newMovieYear: String = ""
@State var newMovieDirector: String = ""
@State var newMovieLanguage: String = ""
@State var newDateAdded: String = ""
@State var newMovieRating: String = ""
@State var newHomeOrTheatre:String = ""

@State var isEditing = false

@State var isShowingImagePicker = false
@State var imageInBlackBox = UIImage()

var body: some View {
    ScrollView {
    VStack {
        Spacer()
        
        VStack (alignment: .leading) {
            HStack {
                Text("Add a New Movie")
                    .font(.system(.title, design: .rounded))
                    .bold()
                Spacer()
                
                Button(action: {
                    self.isShow = false
                }, label: {
                    Image(systemName: "xmark")
                        .foregroundColor(.black)
                        .font(.headline)
                })
            }
            ZStack {
                VStack {
                HStack (alignment: .center){
                    
                    Spacer()
                    Image(uiImage: imageInBlackBox)
                        .resizable()
                        .scaledToFill()
                        .frame(width: 200, height: 200)
                        .border(Color.black, width: 3)
                        .clipped()
                    Spacer()
                }
                
                VStack {
                    Spacer()
                    Button(action: {
                        self.isShowingImagePicker.toggle()
                    }, label: {
                        Text("Select Image")
                            .font(.system(size: 15))
                    })
                    .sheet(isPresented: $isShowingImagePicker, content: { ImagePickerView(isPresented: $isShowingImagePicker, selectedImage: $imageInBlackBox)})
                }
                }
            }
            
            Group {
            TextField("Enter the movie name", text: $newMovieName, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            
            TextField("Enter year movie came out", text: $newMovieYear, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            
            TextField("Enter director's name", text: $newMovieDirector, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            
            
            TextField("Enter language of movie", text: $newMovieLanguage, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            
            
            TextField("Enter date of movie addition", text: $newDateAdded, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            
            TextField("Enter movie rating out of 10", text: $newMovieRating, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            
            TextField("Enter where movie watched, home/theatre", text: $newHomeOrTheatre, onEditingChanged: { (editingChanged) in
                self.isEditing = editingChanged
            })
            .padding()
            .background(Color(.systemGray6))
            .cornerRadius(8)
            .padding(.bottom)
            }
            
            Button(action: {
                if self.newMovieName.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.newMovieYear.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.newMovieDirector.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.newMovieLanguage.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.newDateAdded.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.newMovieRating.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.newHomeOrTheatre.trimmingCharacters(in: .whitespaces) == "" {
                    return
                }
                
                if self.isShowingImagePicker {
                    return 
                }
                
                self.isShow = false
                self.addMovieTask(movieName: self.newMovieName, movieYear: self.newMovieYear, movieDirector: self.newMovieDirector, movieLanguage: self.newMovieLanguage, dateAdded: self.newDateAdded, movieRating: self.newMovieRating, homeOrTheatre: self.newHomeOrTheatre, movieImage: ImagePickerView(isPresented: $isShowingImagePicker, selectedImage: $imageInBlackBox))
            }) {
                Text("Save")
                    .font(.system(.headline, design: .rounded))
                    .frame(minWidth: 0, maxWidth: .infinity)
                    .padding()
                    .foregroundColor(.white)
                    .background(Color.purple)
                    .cornerRadius(10)
            }
            .padding(.bottom)
        }
    }
        .padding()
        .background(Color.white)
        .cornerRadius(10, antialiased: true)
        .offset(y: isEditing ? -320 : 0)
    }
    .edgesIgnoringSafeArea(.bottom)
}

private func addMovieTask(movieName: String, movieYear: String, movieDirector: String, movieLanguage: String, dateAdded: String, movieRating: String, homeOrTheatre: String, isComplete: Bool = false, movieImage: ImagePickerView) {
    
    let task = MovieAdd(movieName: movieName, movieYear: movieYear, movieDirector: movieDirector, movieLanguage: movieLanguage, dateAdded: dateAdded, movieRating: movieRating, homeOrTheatre: homeOrTheatre, movieImage: movieImage)
    addMovie.append(task)
}
}

struct NewMovieView_Previews: PreviewProvider {
static var previews: some View {
    NewMovieView(isShow: .constant(true), addMovie: .constant([]), newMovieName: "", newMovieYear: "", newMovieDirector: "", newMovieLanguage: "", newDateAdded: "", newMovieRating: "", newHomeOrTheatre: "", isShowingImagePicker: true)
}
}

struct ImagePickerView: UIViewControllerRepresentable {

@Binding var isPresented: Bool
@Binding var selectedImage: UIImage

func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePickerView>) -> some UIViewController {
    let controller = UIImagePickerController()
    controller.delegate = context.coordinator
    return controller
}

func makeCoordinator() -> ImagePickerView.Coordinator {
    return Coordinator(parent: self)
}

class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    let parent: ImagePickerView
    init(parent: ImagePickerView){
        self.parent = parent
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let selectedImage = info[.originalImage] as? UIImage {
            print(selectedImage)
            self.parent.selectedImage = selectedImage
        }
        self.parent.isPresented = false
    }
}

func updateUIViewController(_ uiViewController: ImagePickerView.UIViewControllerType, context: UIViewControllerRepresentableContext<ImagePickerView>) {
    //
}
}
导入快捷界面
结构NewMovieView:视图{
@绑定变量:Bool
@绑定var addMovie:[MovieAdd]
@状态变量newMovieName:String=“”
@State var newMovieYear:String=“”
@State var newMovieDirector:String=“”
@状态变量newMovieLanguage:String=“”
@状态变量newDateAdded:String=“”
@状态变量newMovieRating:String=“”
@State var newHomeOrTheatre:String=“”
@状态变量isEditing=false
@状态变量isShowingImagePicker=false
@状态变量imageInBlackBox=UIImage()
var body:一些观点{
滚动视图{
VStack{
垫片()
VStack(对齐:。前导){
HStack{
文本(“添加新电影”)
.font(.system(.title,design:.四舍五入))
.bold()
垫片()
按钮(操作:{
self.isShow=false
},标签:{
图像(系统名:“xmark”)
.foregroundColor(.黑色)
.font(.headline)
})
}
ZStack{
VStack{
HStack(对齐:。中心){
垫片()
图像(uiImage:imageInBlackBox)
.可调整大小()
.scaledToFill()
.框架(宽:200,高:200)
.边框(颜色.黑色,宽度:3)
.clipped()
垫片()
}
VStack{
垫片()
按钮(操作:{
self.isShowingImagePicker.toggle()文件
},标签:{
文本(“选择图像”)
.font(.system(大小:15))
})
.sheet(显示:$isShowingImagePicker,内容:{ImagePickerView(显示:$isShowingImagePicker,selectedImage:$imageInBlackBox)})
}
}
}
团体{
TextField(“输入电影名称”,text:$newMovieName,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
TextField(“输入电影发行年份”,text:$newMovieYear,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
TextField(“输入导演姓名”,text:$newMovieDirector,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
TextField(“输入电影语言”,text:$newMovieLanguage,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
TextField(“输入添加电影的日期”,text:$newDateAdded,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
TextField(“输入10分的电影分级”,text:$newMovieRating,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
文本字段(“输入观看电影的地点、家庭/剧院”,文本:$newHomeOrTheatre,onEditingChanged:{(editingChanged)in
self.isEditing=编辑已更改
})
.padding()
.背景(颜色(.systemGray6))
.转弯半径(8)
.padding(.bottom)
}
按钮(操作:{
如果self.newMovieName.trimmingCharacters(在:。空格中)=“”{
返回
}
如果self.newMovieYear.trimmingCharacters(在:。空格中)=“”{
返回
}
如果self.newMovieDirector.trimmingCharacters(在:。空格中)=“”{
返回
}