Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在SwiftUI中显示和隐藏视图_Ios_Swift_Swiftui - Fatal编程技术网

Ios 在SwiftUI中显示和隐藏视图

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") {

我想在任务完成时显示视图,否则如何调用SwiftView来显示而不使用基于状态布尔的条件?基本上,我想避免对每个需要加载视图的文件进行下面的硬编码

struct ContentView: View {
    @State var doIWantThisViewToShow: Bool = false
    
    var body: some View {
        VStack {
            Button("Show/Hide MyView") {
                doIWantThisViewToShow.toggle()
            }
            if doIWantThisViewToShow {
                MyView()
                    .padding()
            }
        }
    }
}

您可以探索一些减少重复代码的策略

  • 自定义环境值以避免传递@Binding
  • 可重复使用的效果
  • 如果您的状态复杂(可能不复杂),可能需要协议
  • 修改视图层次结构 自定义
    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