菜鸟教程小白 发表于 2022-12-12 15:12:42

ios - 使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是什么?


                                            <p><p>想象一个典型的应用程序,它具有引导、登录/注册和某种内容。当应用程序加载时,您需要决定要显示哪个 View 。一个简单的实现可能如下所示:</p>

<pre><code>struct ContentView: View {
    //assuming some centralized state that keeps track of basic user activity
    @State var applicationState = getApplicationState()

    var body: some View {

      if !applicationState.hasSeenOnboarding {
            return OnBoarding()
      }

      if !applicationState.isSignedIn {
            return Registration()
      }

      return MainContent()
    }
}
</code></pre>

<p>显然这种方法失败了,因为 SwiftUIView 需要 <code>some View</code> 的不透明返回类型。这可以使用 <code>AnyView</code> 包装器类型来缓解(尽管有点骇人听闻),它提供类型删除并允许编译下面的代码。</p>

<pre><code>struct ContentView: View {
    //assuming some centralized state that keeps track of basic user activity
    @State var applicationState = getApplicationState()

    var body: some View {

      if !applicationState.hasSeenOnboarding {
            return AnyView(OnBoarding())
      }

      if !applicationState.isSignedIn {
            return AnyView(Registration())
      }

      return AnyView(MainContent())
    }
}
</code></pre>

<p>有没有更正确的方法不需要使用<code>AnyView</code>? <code>SceneDelegate</code> 中是否有可以处理转换到完全不同的 View 层次结构的功能?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>可能最<code>SwiftUI</code>-y 的方式是使用<code>Group</code>View :</p>

<pre><code>import SwiftUI

struct ContentView: View {
    @State private var applicationState = getApplicationState()

    var body: some View {
      Group {
            if !applicationState.hasSeenOnboarding {
                OnBoarding()
            } else if !applicationState.isSignedIn {
                Registration()
            } else {
                MainContent()
            }
      }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
      ContentView()
    }
}
</code></pre>

<p>需要注意的最重要的一点是,这样一来,您就不会依赖 <code>AnyView</code> 的类型删除(如果不是绝对必要的话,可以避免)。 </p>

<p>如果您想将初始 View 创建封装在一个方法中,请不要使用类型删除。相反,使用 <code>some</code> 关键字:</p>

<pre><code>import SwiftUI

struct ContentView: View {
    @State private var applicationState = getApplicationState()

    private func initialView() -&gt; some View {
      if !applicationState.hasSeenOnboarding {
            OnBoarding()
      } else if !applicationState.isSignedIn {
            Registration()
      } else {
            MainContent()
      }
    }

    var body: some View {
      initialView()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
      ContentView()
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/57780005/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/57780005/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是什么?