首页 > 解决方案 > 在 SwiftUI 中动态隐藏视图

问题描述

我正在尝试有条件DatePicker地在 SwiftUI 中隐藏 a 。但是,我对不匹配的类型有任何问题:

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

在这种情况下,datePicker是一个DatePicker<EmptyView>类型但是datePicker.hidden()是一个_ModifiedContent<DatePicker<EmptyView>, _HiddenModifier>。所以我不能分配datePicker.hidden()datePicker. 我已经尝试过这种方法的变体,但似乎找不到可行的方法。有任何想法吗?

更新

您可以使用它的属性打开_ModifiedContent类型以获取基础类型。content但是,这并不能解决根本问题。该content属性似乎只是原始的、未修改的日期选择器。

标签: swiftswiftui

解决方案


隐藏视图的最简单和最常见的方法如下:

struct ContentView: View {
    @State private var showText = true

    var body: some View {
        VStack {
            Button("Toggle text") {
                showText.toggle()
            }

            if showText {
                Text("Hello World!")
            }
        }
    }
}

这会在equals时从层次结构中删除Text视图。如果您希望选择保留空间或希望将其作为修饰符,请参见下文。showTextfalse


我创建了一个扩展,所以你可以使用修饰符,像这样隐藏视图:

Text("Hello World!")
    .isHidden(true)

或完全删除:

Text("Label")
    .isHidden(true, remove: true)

如果你想使用 Swift Packages,下面的扩展也可以在 GitHub 上找到:GeorgeElsham/HidingViews


下面是创建View修饰符的代码:

我建议您在自己的文件中使用此代码(记住import SwiftUI):

extension View {
    /// Hide or show the view based on a boolean value.
    ///
    /// Example for visibility:
    ///
    ///     Text("Label")
    ///         .isHidden(true)
    ///
    /// Example for complete removal:
    ///
    ///     Text("Label")
    ///         .isHidden(true, remove: true)
    ///
    /// - Parameters:
    ///   - hidden: Set to `false` to show the view. Set to `true` to hide the view.
    ///   - remove: Boolean value indicating whether or not to remove the view.
    @ViewBuilder func isHidden(_ hidden: Bool, remove: Bool = false) -> some View {
        if hidden {
            if !remove {
                self.hidden()
            }
        } else {
            self
        }
    }
}

推荐阅读