"PageTabViewStyle"이 포함 된 TabView는 @State var가 변경 될 때 콘텐츠를 업데이트하지 않습니다.

Aug 20 2020

SwiftUI에서 이상한 문제를 발견했습니다. Button과 PageViewStyle을 사용하는 TabView 만있는 간단한보기를 만들었습니다. TabView가 변수의 상태에 따라 내용을 올바르게 업데이트하지 않는 것 같습니다. 콘텐츠가 어떻게 든 업데이트되는 것 같지만보기가 예상대로 업데이트되지 않습니다.

내 견해의 코드는 다음과 같습니다.

struct ContentView: View {
    @State var numberOfPages: Int = 0
    @State var selectedIndex = 0
    
    var body: some View {
        VStack {
            Text("Tap Me").onTapGesture(count: 1, perform: {
                self.numberOfPages = [2,5,10,15].randomElement()!
                self.selectedIndex = 0
            })
            
            TabView(selection: $selectedIndex){
                ForEach(0..<numberOfPages, id: \.self) { index in
                    Text("\(index)").background(Color.red)
                }
            }
            .frame(height: 300)
            .tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
        }.background(Color.blue)
    }
}

라벨을 여러 번 탭한 후의 결과입니다. 초기 상태는 0 페이지가 아닙니다. 탭한 후 TabView의 내용이 변경되어 모든 페이지를 스크롤 할 수 있고 볼 수 있지만 페이지 표시기 만 어떤 이유로 든 상태를 업데이트합니다.

답변

7 Asperi Aug 20 2020 at 07:16

TabView페이지의 컨테이너가있을 것으로 예상하지만 하나 HStack(동적 콘텐츠 포함) 만 포함하고 탭보기를 재설정해야하는 페이지 수를 연결하므로 여기에 수정 사항이 있습니다.

Xcode 12 / iOS 14로 테스트 됨

struct ContentView: View {
    @State var numberOfPages: Int = 0

    var body: some View {
        VStack {
            Text("Tap Me").onTapGesture(count: 1, perform: {
                self.numberOfPages = [2,5,10,15].randomElement()!
            })
            if self.numberOfPages != 0 {
                TabView {
                    ForEach(0..<numberOfPages, id: \.self) { index in
                        Text("\(index)").frame(width: 300).background(Color.red)
                    }
                }
                .tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
                .frame(height: 300)
                .id(numberOfPages)
            }
        }
    }
}