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