Ios 在SwiftUI中显示和隐藏视图
我想在任务完成时显示视图,否则如何调用SwiftView来显示而不使用基于状态布尔的条件?基本上,我想避免对每个需要加载视图的文件进行下面的硬编码Ios 在SwiftUI中显示和隐藏视图,ios,swift,swiftui,Ios,Swift,Swiftui,我想在任务完成时显示视图,否则如何调用SwiftView来显示而不使用基于状态布尔的条件?基本上,我想避免对每个需要加载视图的文件进行下面的硬编码 struct ContentView: View { @State var doIWantThisViewToShow: Bool = false var body: some View { VStack { Button("Show/Hide MyView") {
struct ContentView: View {
@State var doIWantThisViewToShow: Bool = false
var body: some View {
VStack {
Button("Show/Hide MyView") {
doIWantThisViewToShow.toggle()
}
if doIWantThisViewToShow {
MyView()
.padding()
}
}
}
}
您可以探索一些减少重复代码的策略
EnvironmentValue
将状态向下广播到子视图。这将避免通过可能不使用该值的视图传递@Binding
请记住,这是一个单向自上而下的广播。与@Binding不同,子级不能改变父级状态。(但他们可以改变自己孩子对上述状态的认识。)
在父项中设置
@State var isHovered=false
var父对象:一些视图{
///
.environment(\.parentIsHovered,isHovered)
}
观察儿童
@Environment(\.parentIsHovered)var parentIsHovered
var-child:一些视图{
///
.灰度(parentIsHovered?0:0.9)
.animation(.easeInOut,值:parentIsHovered)
}
定义
private结构ParentIsHoveredKey:EnvironmentKey{
静态let defaultValue:Bool=false
}
扩展环境值{
var parentIsHovered:布尔{
获取{return self[ParentIsHoveredKey]}
集合{self[ParentIsHoveredKey]=newValue}
}
}
可重复使用的效果
如果灰显某些视图或显示加载指示器,则可以使用接受绑定并有条件显示覆盖、背景或效果的ViewModifier
下面的示例演示了通过将.animation
API链接到accessibilityReduceMotion
//查看
.animate(.easeOut(持续时间:.fast),值:isLoading)
扩展视图{
func animate(animation:animation?,值:E)->一些视图{
修改器(可访问的动画修改器(动画,用于:值))
}
}
结构AccessibleAnimationModifier:ViewModifier{
@环境(\.accessibilityReduceMotion)变量还原情感
init(uAnimation:animation?=.default,值为:E){
self.animation=动画
自我价值=价值
}
动画:动画?
var值:E
func正文(内容:内容)->某些视图{
内容
.animation(还原情感?.none:动画,值:值)
}
}
对加载状态作出反应
除非通过观察到的类处理加载状态,否则需要使用@state将该状态存储在视图中
在扩展中使用默认实现的协议可能有助于在计算视图之间的复杂加载状态时减少重复代码
下面的伪代码定义了一个协议DragSource,其中的函数返回NSItemProvider。该扩展提供了视图或VM可以调用的默认实现
protocoldragsource{
func makeDraggableThing1(///content+logic objects)->NSItemProvider
}
扩展DragSource{
func makeDraggableThing1(//)->NSItemProvider{
///默认工作我只想在应用程序中编辑一次
}
}
您的意思是您将拥有一个文件列表(如在ForEach
中),并且您不想为每个文件编写一个@State
?您可以将其抽象到它自己的组件中,这样您只需编写一次@State
,但您可以反复使用组件(视图
)。@jnpdx基本上更好的例子是登录Firebase中的应用程序。我必须显示一个加载视图,但我不想把它作为绑定到bool的应用程序中每个“页面”的条件。因为如果我这样做,我必须在每一页上都写。如果doiwantthisviewthow{MyView().padding()}为什么会出现在每一页上?将其作为条件写在最上面的父视图上,它将应用于它下面的所有内容。@jnpdx感谢您的澄清,但是最上面的父视图是什么,或者它在代码中的外观如何?它看起来与您现在的情况完全一样,假设您将所有其他内容都设置为子视图(存在于)MyView
。