わからないこと
modelの値を更新しても、親Viewのテキストが更新されない。
親Viewから更新しても、子Viewから更新されても、子Viewのテキストが更新されるだけで親Viewのテキストは更新されない
下記ソースコード内のコメントにあるように、
- 子View内から値を更新すると、子Viewのテキストは更新されるが親Viewのテキストは更新されない
- 親View内から値を更新しても、上記と同様
親Viewのテキストを自動的に更新するようにしたいです.
@Published したものは、更新されると自動的に通知をするようですが、何故かされない状況です.
よろしくお願いします.
環境
- Xcode: 11.3
- Swift: 5.1.3
ソースコード
swift
1import Foundation 2import SwiftUI 3 4//親View 5struct ContentView: View { 6 @ObservedObject var viewModel: ContentViewModel 7 8 var body: some View { 9 VStack { 10 List(viewModel.songs) { song in 11 SongCell(viewModel: self.viewModel, song: song) 12 } 13 14 //3. ここの値が更新されない(起動時のデフォルト値は"title1") 15 Text("I am ContetView : (viewModel.songs[0].title)") 16 17 //2. セルをタップ後(viewModel.songs[0].titleを"changed from ContentView"に更新) 18 //上にある3.のテキストは更新されない 19 Button(action: { 20 self.viewModel.songs[0].title = "changed from ContentView" 21 }, label: {Text("contentView add song")}) 22 } 23 } 24} 25 26//楽曲ごとのセル、子ビュー 27struct SongCell: View { 28 @ObservedObject var viewModel: ContentViewModel 29 @ObservedObject var song: Song 30 31 32 var body: some View { 33 HStack { 34 Text("(song.title) / (song.artist)") 35 Button(action: { 36 37 //1. セル内の表記のみ変化する(viewModel.songs[0].titleを更新) 38 // 親ビューの3.のテキストは更新されない 39 self.song.title = "changed from SongCell" 40 41 }, label: { 42 Text("button") 43 }) 44 } 45 } 46} 47 48//ViewModel 49class ContentViewModel: ObservableObject { 50 @Published var songs: [Song] = [ 51 Song.init(title: "title1", artist: "artist1", url: "url1"), 52 ] 53 54 func addSong(title: String, artist: String, url: String) -> Void { 55 let song = Song(title: title, artist: artist, url: url) 56 songs.append(song) 57 } 58 59 func titleChange(song: Song, newTitle: String) { 60 song.title = newTitle 61 } 62} 63 64 65//各曲のデータ 66class Song: Identifiable, ObservableObject{ 67 var id = UUID() 68 @Published var title: String 69 @Published var artist: String 70 @Published var url: String 71 72 init(title: String, artist: String, url: String) { 73 self.title = title 74 self.artist = artist 75 self.url = url 76 } 77} 78
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/31 02:19
2019/12/31 02:35
2019/12/31 06:56
2019/12/31 14:18