SwiftUI ScrollView가 업데이트되지 않습니까?


10

에 표시 할 데이터 가져 오기 scrollView

예상 결과

스크롤보기에 표시된 데이터

실제 결과

빈보기

대안

사용 List하지만 유연하지 않습니다 (구분 기호를 제거 할 수 없으며 여러 열을 가질 수 없음)

암호

struct Object: Identifiable {
    var id: String
}

struct Test: View {
    @State var array = [Object]()

    var body: some View {
//        return VStack { // uncomment this to see that it works perfectly fine
        return ScrollView(.vertical) {
            ForEach(array) { o in
                Text(o.id)
            }
        }
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}

Xcode 11.1, iOS 13.1, Swift 5에서 이것을 테스트하고 예상 결과를 얻었습니다 (스크롤보기가 가운데가 아니라 맨 위에 있지만).
sfung3

키워드도 필요 없습니다return
sfung3

흥미로운, 나는 엑스 코드 11.2, 아이폰 OS 13.2, 스위프트 5 일 해요
youjin

print, 전에 성명서 가 있었 으므로return
youjin

Xcode 11.2로 업데이트하고 이것을 재현 할 수 있는지 확인하겠습니다. 시간이 좀 걸리지 만 발견 한 내용을 업데이트하겠습니다.
sfung3

답변:


10

이 문제를 해결하는 그렇게 해킹되지 않은 방법은 ScrollView를 배열이 비어 있는지 확인하는 IF 문으로 묶는 것입니다.

if !self.array.isEmpty{
     ScrollView(.vertical) {
          ForEach(array) { o in
               Text(o.id)
          }
     }
}

이 해결 방법은 완벽합니다. 감사합니다!
헨드릭

1

예상되는 동작은 Xcode 11.1있지만 발생 하지 않습니다.Xcode 11.2.1

에 나타나는 frame수정자를 추가했습니다.ScrollViewScrollView

struct Object: Identifiable {
    var id: String
}

struct ContentView: View {
    @State var array = [Object]()

    var body: some View {
        ScrollView(.vertical) {
            ForEach(array) { o in
                Text(o.id)
            }
        }
        .frame(height: 40)
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}

이 시뮬레이터에 아이폰 OS 13.2 작업을 얻을 불행히도 수 없습니다
youjin

1

상태가 빈 배열이 아닌 어떤 값으로 초기화되면 예상대로 작동합니다 (Xcode 11.2). 이 경우 업데이트가 올바르게 작동하고 초기 상태는 영향을 미치지 않습니다.

struct TestScrollViewOnAppear: View {
    @State var array = [Object(id: "1")]

    var body: some View {
        ScrollView(.vertical) {
            ForEach(array) { o in
                Text(o.id)
            }
        }
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}

간단한 경우에 대한 작품, 내 경우에는 내가에서 네트워크 호출을 가지고 onAppear, 그래서 문제가 될 수 있습니다 더미 데이터로있는 ScrollView를 초기화하는
youjin

정확하지만이 상황은 코드에서 논리적으로 처리 할 수 ​​있습니다. 초기 객체는 '로드'와 같은 조건부로 무언가를 표시하기 위해 쉽게 감지 할 수있는 스텁이 될 수 있습니다.
Asperi

1

내가 찾은 해킹 한 가지 해결 방법 Rectangle은 scrollView 안에 "보이지 않는"을 추가하는 width것입니다.scrollView

struct Object: Identifiable {
    var id: String
}

struct ContentView: View {
    @State var array = [Object]()

    var body: some View {
        GeometryReader { geometry in
            ScrollView(.vertical) {
                Rectangle()
                    .frame(width: geometry.size.width, height: 0.01)
                ForEach(array) { o in
                    Text(o.id)
                }
            }
        }
        .onAppear(perform: {
            self.array = [Object(id: "1"),Object(id: "2"),Object(id: "3"),Object(id: "4"),Object(id: "5")]
        })
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.