【问题标题】:Swift UI navigation from splash screen to another screen automatically with delay timeSwift UI 自动从初始屏幕导航到另一个屏幕,并带有延迟时间
【发布时间】:2019-11-21 04:08:28
【问题描述】:

我是 IOS 和 Swift UI 的新手,在闪屏后我无法导航到登录屏幕。如何导航到登录屏幕?请帮帮我!!我非常感谢您的所有回答。

import SwiftUI
import Dispatch

struct SplashScreen: View {
    let login = LoginScreen()
    let color = Color.init("black_1")
//    let color = Color.white
    var body: some View {
        let stack = VStack(alignment: .center){
            Image("logo")
            }.background(color).onAppear(perform: {
            gotoLoginScreen(time: 2.5)
        })

        return stack
    }
}

func gotoLoginScreen(time: Double){
    DispatchQueue.main.asyncAfter(deadline: .now() + Double(time)) {
        print("gotoLoginScreen")
    }
    return
}

struct SplashScreen_Previews: PreviewProvider {
    static var previews: some View {
        SplashScreen()
    }
}

【问题讨论】:

    标签: ios navigation delay swiftui


    【解决方案1】:

    考虑到您可能不想在您已经在 LoginScreen 上之后返回到初始屏幕,我建议另一种方法,特别是在 SceneDelegate 中更改 UIHostingControllerrootView .

    如果您想推送到下一个屏幕,您可以使用以下代码重构:

    struct SplashScreen: View {
        @State private var isActive = false
        let login = LoginScreen()
        let color = Color.init("black_1")
    
        var body: some View {
            NavigationView {
                VStack(alignment: .center) {
                    Image("logo")
                    NavigationLink(destination: login,
                                   isActive: $isActive,
                                   label: { EmptyView() })
                }
                .background(color)
                .onAppear(perform: {
                    self.gotoLoginScreen(time: 2.5)
                })
            }
        }
    
        func gotoLoginScreen(time: Double) {
            DispatchQueue.main.asyncAfter(deadline: .now() + Double(time)) {
                self.isActive = true
            }
        }
    }
    

    【讨论】:

    • 您的方法是正确的,我也喜欢这样做,方法是使用布尔变量 isActive 在登录屏幕之后显示和隐藏启动画面
    • 我在登录屏幕中的代码: //splash screen VStack(alignment: .center){ SplashScreen() .opacity(showSplash ? 1 : 0) .onAppear { self.showSplashScreen(time: 2.5) }在 SceneDelegate 中:我首先启动登录屏幕而不是启动屏幕。
    【解决方案2】:

    这对我有用。

    import SwiftUI
    
    struct ContentView: View {
        
        @State var isActive:Bool = false
        
        var body: some View {
            
            VStack {
                
                if self.isActive {
                
                LoginScreen()
                
                } else {
                    
                    Image("logo")
                    
                }
                
            }.onAppear {
              
                DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
               
                    withAnimation {
                        self.isActive = true
                    }
                }
            
        }
        
        }
        
    }
    
    
    struct LoginScreen: View {
        var body: some View {
            
            VStack {
                
                Text("Welcome to")
                Text("the LoginView")
                
            }
            
        }
    }
    

    【讨论】:

      【解决方案3】:

      我想你想要这样的东西:

      导入 SwiftUI

      struct LoginScreen: View {
          var body: some View {
              VStack {
                  Text("Welcome to")
                  Text("the LoginView")
              }.navigationBarTitle("Login")
          }
      }
      
      struct SplashScreen: View {
          @State private var isActive = false
      
          var body: some View {
              NavigationView {
                  VStack {
                      Image("logo")
                      NavigationLink(destination: LoginScreen(),
                                     isActive: $isActive,
                                     label: { EmptyView() })
                  }
                  .onAppear(perform: {
                      self.gotoLoginScreen(time: 2.5)
                  })
              }
          }
      
          func gotoLoginScreen(time: Double) {
              DispatchQueue.main.asyncAfter(deadline: .now() + Double(time)) {
                  self.isActive = true
              }
          }
      }
      

      【讨论】:

      • 感谢您的回答,但这不是正确的答案。
      • @Phu:最初我不明白你的问题,但我确实看到了你现在想要实现的目标。我已经更新了我的答案以反映这一点。
      【解决方案4】:

      内容视图:

      struct ContentView: View {
      var body: some View {
          NavigationView {
              VStack {
                  NavigationLink(destination: LoginView()) {
                      Text("Navigate")
                  }
              }
              .navigationBarTitle("LoginView")
              .navigationBarHidden(true)
          }
        }
      }
      

      您的登录视图:

      struct LoginView: View {
       @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
      
        var body: some View {
      
            Button(action: {
               self.presentationMode.wrappedValue.dismiss()
            }) {
                Image(systemName: "gobackward").padding()
            }
            .navigationBarHidden(true)
      
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2014-12-07
        相关资源
        最近更新 更多