ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

DatePickerで選択中のウインドウを閉じる方法

サンプルプロジェクトで再現できないんだけど、DatePickerで日付を選択中にモーダールビューを表示しようとすると表示できなくなる現象があって、選択を一度解除してからモーダールビュー表示しないと上手くいかない。
(NavigationViewやSheetなど何重かにViewが重なってるからだと思うが上手く再現できない。)

このカレンダー選択が表示されているかどうかが知りたいのだが情報を得られず。
せめて閉じる方法がないかと検索したらこちらがヒット。

stackoverflow.com

DatePickerのIDを変えると初期状態に戻してくれるらしく、結果として閉じることができる。
モーダルビューは次のRun-Loopで処理しないとうまく表示されないようで、DispatchQueue.main.asyncで遅延させている。

struct PresentedView: View {
    @State var date = Date()
    @State var isPresented = false

    @State var calendarId: UUID = UUID()

    var body: some View {
        VStack {
            Spacer()
            DatePicker("Selecte a date", selection: $date)
                .id(calendarId)
            Spacer()
            Button("Open") {
                calendarId = UUID()
                DispatchQueue.main.async {
                    isPresented.toggle()
                }
            }
        }
        .padding(20)
        .sheet(isPresented: $isPresented, content: {
            Color.green
        })
    }
}

しかしよくこういう所に辿り着くもんだと感心する。