swift - 在 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
属性似乎只是原始的、未修改的日期选择器。
解决方案
隐藏视图的最简单和最常见的方法如下:
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
视图。如果您希望选择保留空间或希望将其作为修饰符,请参见下文。showText
false
我创建了一个扩展,所以你可以使用修饰符,像这样隐藏视图:
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
}
}
}
推荐阅读
- android - 如何在第一个活动中更新回收站视图,同时更改其他活动中的数据?
- progress - 制表符显示来自不同数据字段的进度图例编号
- haskell - 为什么编译器不能在 Haskell 中为我们处理 newtype?
- maven - 来自私有包注册表的 Gitlab CI/CD Maven 依赖项:找不到工件
- html - Bootstrap - 2列 - 在窄屏幕上使图像全宽
- sql - 解析两个字符之间的单词 SQL Netezza
- javascript - 如何在javascript中将嵌套的json对象导出到csv?
- python - 数据框拆分列值,如何解决错误消息?
- css - 如何在 React 中更改引导导航栏切换器
- reactjs - 在 react-three-fiber 和 NextJS 中加载 bm-font