SwiftUIでビューを動的に非表示にする 質問する

SwiftUIでビューを動的に非表示にする 質問する

SwiftUI で条件付きで非表示にしようとしていますDatePicker。ただし、型の不一致に関する問題が発生しています。

var datePicker = DatePicker($datePickerDate)
if self.showDatePicker {
    datePicker = datePicker.hidden()
}

この場合、datePickerDatePicker<EmptyView>型ですdatePicker.hidden()が です。したがってに_ModifiedContent<DatePicker<EmptyView>, _HiddenModifier>割り当てることはできません。このバリエーションを試してみましたが、うまくいく方法が見つからないようです。何かアイデアはありますか?datePicker.hidden()datePicker

アップデート

型をアンラップし_ModifiedContentて、そのcontentプロパティを使用して基になる型を取得できます。ただし、これでは根本的な問題は解決されません。contentプロパティは、変更されていない元の日付ピッカーであるように見えます。

ベストアンサー1

✅ 正しい、そして最も簡単な方法:

代わりにアルファを設定することもできます。これにより、ビューのレイアウトスペースも保持され、他の回答のようにダミービューを追加する必要がなくなります。

.opacity(isHidden ? 0 : 1)
デモ

デモ


�� よりクリーンな方法! - 元のhidden修飾子を拡張します:

また、可視性の状態を引数として取得するカスタム関数を実装することもできます。

extension View {
    func hidden(_ shouldHide: Bool) -> some View {
        opacity(shouldHide ? 0 : 1)
    }
}

次に、 をbool修飾子に渡します。

DatePicker($datePickerDate)
    .hidden(showDatePicker)

ご了承ください修飾子の元の動作とは異なりhidden、これらの両方の方法では、非表示のビューのフレームが保持されます。


⛔️ 悪い習慣はやめてください!!!

他のすべての回答 (@Jake によって承認された回答を含む) では、パフォーマンスの低下を引き起こす依存コードの代わりにブランチが使用されています。

�� ブランチの例: (世界最大の開発者会議

支店

✅ 依存コードの例:

依存コードの例

戻る論理的な同じビュー異なる状態の場合、SwiftUIのレンダリングエンジンがビューを再レンダリングして初期化するため、パフォーマンスが低下します。(詳細はこのWWDCセッション

おすすめ記事