@Published는 텍스트를 업데이트하지만 목록은 업데이트하지 않는 이유는 무엇입니까?

Dec 15 2020

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.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

2 Nate Dec 15 2020 at 08:34

나는 당신의 문제에 대한 해결책이 될 수있는 이전 게시물에 대한이 답변 을 찾을 수있었습니다 . 목록에 텍스트가 전혀 없다고 말할 때이를 확인하기 위해 디버그 했습니까, 아니면 단순히 화면에 데이터가 표시되지 않았습니까?

코드 스 니펫의 복사본을 만들고 그것을 조작했을 때 목록에 실제로 목록이 화면에 표시하려고하는 데이터가있는 것처럼 보였지만 목록의 프레임이 Scrollview에 의해 재정의되었습니다. GeometryReader 내부에 모든 것을 중첩하고 List에 프레임 크기를 제공하면 프로그램에 원하는 기능을 제공했습니다.

1 nicksarno Dec 15 2020 at 10:22

데이터에 대해 ScrollView 또는 List를 사용하십시오. 목록에 여러 값이있는 경우 자동으로 스크롤 가능한 목록으로 바뀝니다. 따라서 ScrollView를 완전히 제거 할 수 있다고 생각합니다.

1 Asperi Dec 15 2020 at 10:53

다음은 수정 된 작업 변형입니다 (일부 복제 포함-프로젝트에 다시 적용해야 함).

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)
                }
            }
        }
    }
    
}