SwiftUI-프로그래밍 방식으로 시트 제공

Aug 31 2020

사용자가 선택할 수있는 여러 옵션이있는 모달 시트를 표시하고 싶습니다. (공유 시트는 완벽한 예입니다.) 사용자가 선택하면 옵션 시트가 사라지고 선택한 옵션과 함께 두 번째 시트가 나타납니다. 공유 시트 예제에서 사용자가 인쇄를 선택하면 공유 시트가 아래로 슬라이드되고 인쇄 시트가 팝업됩니다.

옵션 시트가 충분히 쉽게 나타날 수 있습니다. 그러나 두 번째 시트를 표시하는 방법을 찾지 못했습니다. 빈 뷰에 시트를 첨부 한 다음 UserDefaults를 사용하여 두 번째 시트를 활성화하는 부울을 설정했습니다. 아무것도.

첫 번째 시트

Button(action: {
   UserDefaults.standard.set(true, forKey: showSelectedOption)
   showOptionForm = true
}) {
   Image(systemName: "square.and.arrow.up")
}
.sheet(isPresented: $showOptionForm) {
   OptionView().environment(\.managedObjectContext, self.moc)
})

SecondSheet

EmptyView()
   .sheet(isPresented: $showSelectedOption) {
      SelectedOptionView().environment(\.managedObjectContext, self.moc)
}

.onAppear에서 아래 표시된 부울을 설정하려고 시도했지만 모달 시트가 닫힐 때 호출되지 않습니다. 뷰가 더 이상 시트로 가려지지 않는시기를 알 수있는 방법이 있습니까? UIKit에서는 presentationControllerDidDismiss (_ :) 일 것입니다. 물론 이것은 두 번째 시트를 빈 뷰에 첨부하려는 내 아이디어가 실행 가능하다고 가정합니다.

let showSelectedOption = UserDefaults.standard.bool(forKey: "showSelectedOption")

답변

2 Asperi Aug 31 2020 at 22:06

다음은 가능한 접근 방법의 데모입니다 onDismiss. 첫 번째 시트의 두 번째 시트를 활성화 합니다. Xcode 12 / iOS 14로 테스트되었습니다.

struct DemoTwoSheets: View {
    @State private var firstSheet = false
    @State private var secondSheet = false
    var body: some View {
        VStack {
            Button("Tap") { self.firstSheet = true }
                .sheet(isPresented: $firstSheet, onDismiss: { self.secondSheet = true }) { Text("First sheet") } EmptyView() .sheet(isPresented: $secondSheet) {
                    Text("Second sheet")
                }
        }
    }
}

최신 정보:

SwiftUI 1.0에서도 작동하는 대안이 있습니다. Xcode 11.4 / iOS 13.4 및 Xcode 12b5 / iOS 14로 테스트되었습니다.

struct DemoTwoSheets: View {
    @State private var firstSheet = false
    @State private var secondSheet = false
    var body: some View {
        VStack {
            Button("Tap") { self.firstSheet = true }
                .sheet(isPresented: $firstSheet, onDismiss: { self.secondSheet = true }) { Text("First sheet") } .background(Color.clear .sheet(isPresented: $secondSheet) {
                        Text("Second sheet")
                    })
        }
    }
}