コードの内容
CoreData swiftUIを使ってListを作っています。
コードはCoredataのtimeに1秒毎dateという変数を代入して更新させています。
読みやすいようにギリギリまでこーど
起きた問題
この時にアプリを開いてる間は画面が更新することができず、アプリをいったん閉じないとListのテキストが更新されません。
質問
アプリを開いたままListに表示されるテキストを更新するにはどうしたら良いでしょうか?
作りたい機能の性質上、変数dateをそのままListのテキストに入れるのではなく、Coredataのtimeに代入してListのテキストに表示したいです。
やろうとしたこと
swiftUIで画面を更新するにはこの3つしか分からず、ネットでも見つかりませんでした。
@State,@EnvironmentObject,@ObservedObject
swift
1import SwiftUI 2import CoreData 3 4extension Event { 5 static func create(in managedObjectContext: NSManagedObjectContext){ 6 let newEvent = self.init(context: managedObjectContext) 7 newEvent.time = Date() 8 do { 9 try managedObjectContext.save() 10 } catch { 11 fatalError() 12 } 13 } 14} 15extension Event: Identifiable {} 16 17 18struct ContentView: View { 19 var body: some View { 20 NavigationView { 21 MasterView() 22 } 23 } 24} 25 26struct MasterView: View { 27 28 @FetchRequest( 29 sortDescriptors: [NSSortDescriptor(keyPath: \Event.time, ascending: true)],animation: .default) 30 var events: FetchedResults<Event> 31 @Environment(.managedObjectContext) var viewContext 32 33 @State var date = Date() 34 let timer = Timer.publish(every: 1, on: .current, in: .common).autoconnect() 35 36 var body: some View { 37 VStack{ 38 Button(action:{ 39 Event.create(in: self.viewContext) 40 }) { 41 Text("create") 42 } 43 List { 44 ForEach(events) { event in 45 NavigationLink(destination: DetailView(event: event)) { 46 Text("(event.time!)") 47 .onReceive(self.timer) {_ in 48 event.time = self.date 49 } 50 } 51 } 52 } 53 } 54 } 55} 56struct DetailView: View { 57 @ObservedObject var event: Event 58 var body: some View { 59 Text("(event.time ?? Date())") 60 } 61} 62 63 64 65struct ContentView_Previews: PreviewProvider { 66 static var previews: some View { 67 ContentView() 68 } 69} 70
あなたの回答
tips
プレビュー