@Published는 텍스트를 업데이트하지만 목록은 업데이트하지 않는 이유는 무엇입니까?
Text
업데이트 이유를 이해 List
하지 못하지만 그렇지 않습니다.
@Published
날짜 배열 인 모델 이 있습니다. 날짜에서 텍스트를 생성하는 방법도 있습니다.
다음은 단순화 된 버전입니다.
class DataModel: NSObject, ObservableObject {
@Published var selectedDates: [Date] = []
func summary() -> String {
var lines: [String] = []
for date in selectedDates.sorted().reversed() {
let l = "\(someOtherStuff) \(date.dateFormatted)"
lines.append(l)
}
return lines.joined(separator: "\n")
}
}
그리고 저는 제 관점에서이 텍스트를 보여줍니다. 다음은 단순화 된 버전입니다.
struct DataView: View {
@ObservedObject var model: DataModel
var body: some View {
ScrollView {
Text(model.summary())
}
}
}
작동합니다. 사용자가보기의 UI에서에 날짜를 추가 model.selectedDates
하면 요약 텍스트가 제대로 업데이트됩니다.
이제 텍스트를 줄 목록으로 바꾸고 싶습니다.
방법을 변경합니다.
func summary() -> [String] {
var lines: [String] = []
for date in selectedDates.sorted().reversed() {
let l = "\(someOtherStuff) \(date.dateFormatted)"
lines.append(l)
}
return lines
}
보기를 변경하십시오.
var body: some View {
ScrollView {
List {
ForEach(model.summary(), id: \.self) { line in
Text(line)
}
}
}
}
그러나 이것은 작동하지 않습니다. 목록에 텍스트가 전혀 없으며 사용자가에 날짜를 추가 할 때 업데이트되지 않습니다 model.selectedDates
.
내가 도대체 뭘 잘못하고있는 겁니까?
답변
나는 당신의 문제에 대한 해결책이 될 수있는 이전 게시물에 대한이 답변 을 찾을 수있었습니다 . 목록에 텍스트가 전혀 없다고 말할 때이를 확인하기 위해 디버그 했습니까, 아니면 단순히 화면에 데이터가 표시되지 않았습니까?
코드 스 니펫의 복사본을 만들고 그것을 조작했을 때 목록에 실제로 목록이 화면에 표시하려고하는 데이터가있는 것처럼 보였지만 목록의 프레임이 Scrollview에 의해 재정의되었습니다. GeometryReader 내부에 모든 것을 중첩하고 List에 프레임 크기를 제공하면 프로그램에 원하는 기능을 제공했습니다.
데이터에 대해 ScrollView 또는 List를 사용하십시오. 목록에 여러 값이있는 경우 자동으로 스크롤 가능한 목록으로 바뀝니다. 따라서 ScrollView를 완전히 제거 할 수 있다고 생각합니다.
다음은 수정 된 작업 변형입니다 (일부 복제 포함-프로젝트에 다시 적용해야 함).
Xcode 12.1 / iOS 14.1로 테스트 됨
class DataModel: NSObject, ObservableObject {
@Published var selectedDates: [Date] = []
func summary() -> [String] {
var lines: [String] = []
for date in selectedDates.sorted().reversed() {
let l = "someOtherStuff \(date)"
lines.append(l)
}
return lines
}
}
struct DataView: View {
@ObservedObject var model: DateDataModel = DataModel()
var body: some View {
VStack {
Button("Add") { model.selectedDates.append(Date())}
List {
ForEach(model.summary(), id: \.self) { line in
Text(line)
}
}
}
}
}