在CoreData记录中进行更改,SwiftUI

问题描述 投票:0回答:1

我正在使用SwiftUI学习核心数据。我想制作一个可以发布喜欢的电影,进行评论并添加评分的应用。

我已经可以在我的应用中添加新电影了,将其删除,请参阅电影详细信息。现在,我想编辑CoreData中的记录。我发现这很困难,因为我不知道如何将默认值从编辑过的电影放到我的表单中。

我的代码:

struct EditMovieVIew: View {
let movie: Movie
@Environment(\.presentationMode) var presentationMode
@Environment(\.managedObjectContext) var moc

@State private var title = ""
@State private var director = ""
@State private var review = ""
@State private var genre = "Fantasy"
@State private var rating = 3
@State private var productionYear = Date()


    let genres = ["Sci-Fi","Fantasy", "Comedy", "Horror", "Thriller", "Criminal", "Kids", "Romance", "Drama"]

    var body: some View {
        NavigationView {
            Form {
                Section {
                    TextField("Name of movie", text: $title)
                    TextField("Director's name", text: $director)
                }

                Section {
                    DatePicker(selection: $productionYear, in: ...Date(), displayedComponents: .date) {
                        Text("Date of production")
                    }
                }

                Section {
                    Picker(selection: $genre, label: Text("Genre")) {
                        ForEach(genres, id: \.self) {
                            Text($0).tag($0)
                        }
                    }
                }.navigationBarTitle("Select your cheese")

                Section {
                    RatingView(rating: $rating)

                    TextField("Write a review", text: $review)
                }

                Section {
                    Button("Save") {
                        let newMovie = Movie(context: self.moc)
                        newMovie.title = self.title
                        newMovie.director = self.director
                        newMovie.rating = Int16(self.rating)
                        newMovie.review = self.review
                        newMovie.genre = self.genre
                        newMovie.productionYear = Int16(Calendar.current.component(.year, from: self.productionYear))

                        try? self.moc.save()
                        self.presentationMode.wrappedValue.dismiss()


                    }
                }
            }
            .navigationBarTitle("Add Movie")
        }

    }
}

struct EditMovieVIew_Previews: PreviewProvider {
static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

static var previews: some View {
    let movie = Movie(context: moc)
    movie.title = "Test Movie"
    movie.director = "Test director"
    movie.genre = "Fantasy"
    movie.rating = 4
    movie.review = "Good movie"
    movie.productionYear = 2019

    return NavigationView {
        EditMovieVIew(movie: movie)
    }
}

}

我也在尝试制作

@Binding var movie: Movie

但是我的主意都行不通。

哪里出问题了?当我想为我的TextField和Pickers分配一个值时,我不能使用我的

文本:$ movie.title。 //或文字:movie.title //或文字:self.movi​​e.title

因此,我接下来要做的就是将默认值分配给我的@State值。我写过:@State private var title = self.movie.title,但是Xcode说比我不能在这里使用selfmovie

所以我的问题是-如何为我的TextField设置默认起始值​​,以便能够编辑我的电影并在CoreData中对其进行更新?

PS。我还有另一个问题。我只想将DatePicker设为挑选年份。现在我有完整的选择器,然后只使用用户选择的年份,但是我认为最好只选择一年

I want TextFields to have default value got from original movie

ios swift core-data swiftui edit
1个回答
1
投票

您应该在自定义init函数中执行此操作。因为它们是@State包裹的,所以您需要跳过一个很小的箍以正确设置它们。

@State private var title: String // don't set up any initial value here

init(movie: Movie) {
  self.movie = movie
  self._title = State(initialValue: movie.title ?? "")
  // etc.
}

注意_title,这意味着您正在初始化包装器而不是包装的值。

对于问题2,如果只关心年份,请考虑存储DateComponents而不是Date,而只是设置自定义选择器而不是DatePicker。填充追溯到1850年(或任何时候)的年份非常简单。或有一个年份文本字段。实现此目的的方法很多。

© www.soinside.com 2019 - 2024. All rights reserved.