ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SwiftUI Core Data 93 - 데이터 Refresh
    SwiftUI 100 레시피/Core Data 2022. 7. 1. 13:22

    92 강좌에서 데이터 수정후 리스트 refresh가 안되는 현상을 수정하기 위한 방법

     

    #1. ContentView

    import SwiftUI

     

    struct ContentView: View {

        

        let coreDM: CoreDataManager

        @State private var movieName: String = ""

        @State private var movies: [Movie] = [Movie]()

        @State private var needsRefresh: Bool = false //리플레쉬 버그를 해결하기 위해

        

        //데이터 가져오기

        private func populateMovies(){

            movies = coreDM.getAllMovies()

            print(movies[0].title!)

        }

        

        var body: some View {

            ////NavigatioView Start

            NavigationView{

                VStack{

                    TextField("Enter movie name", text: $movieName).textFieldStyle(RoundedBorderTextFieldStyle())

                    Button("Save"){

                        coreDM.saveMovie(title: movieName)

                        populateMovies()

                    }

     

                    List{

                        ForEach(movies, id: \.self){ movie in

                            

                            NavigationLink(

                                destination: MovieDetail(movie: movie, coreDM:coreDM, needsRefresh:$needsRefresh),

                                label: {

                                    Text(movie.title ?? "")

                            })

                            

                            

                        }.onDelete(perform: { indexSet in

                            indexSet.forEach{ index in

                                let movie = movies[index]

                                coreDM.deleteMovie(movie: movie)

                                populateMovies()

                            }

                        })

                    }.listStyle(PlainListStyle())

                        .accentColor(needsRefresh ? .white: .black)

                    Spacer()

                    

                }.padding()

                    .onAppear(perform: {

                        populateMovies()

                    })

            

            }

            ////NavigatioView End

        }

    }

     

    struct ContentView_Previews: PreviewProvider {

        static var previews: some View {

            ContentView(coreDM: CoreDataManager())

        }

    }

     

     

    #2. MovieDetail

    import SwiftUI

     

    struct MovieDetail: View {

        

        let movie: Movie

        @State private var movieName: String = ""

        let coreDM: CoreDataManager

        @Binding var needsRefresh: Bool

        

        var body: some View {

            VStack{

                

                TextField(movie.title ?? "", text:$movieName).textFieldStyle(RoundedBorderTextFieldStyle())

                Button("Update"){

                    if !movieName.isEmpty{

                        movie.title = movieName

                        coreDM.updateMovie()

                        needsRefresh.toggle()

                    }

                }

                Spacer()

            }.padding()

        }

    }

     

    struct MovieDetail_Previews: PreviewProvider {

        static var previews: some View {

            

            let coreDM = CoreDataManager()

            let movie = Movie(context: coreDM.persistentContainer.viewContext)

            

            

            MovieDetail(movie: movie, coreDM: coreDM, needsRefresh: .constant(false))

        }

    }

     

    BatMan을 수정

     

    BatMan2로 수정후 Back누름

     

    리스트가 수정됨

    댓글

Designed by Tistory.