Быстрое переключение пользовательского интерфейса с заставки на другой экран автоматически с задержкой - PullRequest
0 голосов
/ 21 ноября 2019

Я новичок в 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()
    }
}

Ответы [ 3 ]

1 голос
/ 21 ноября 2019

Учитывая, что вы, вероятно, не захотите возвращаться к заставке после того, как вы уже находитесь на LoginScreen, я бы предложил другой подход и, в частности, изменил rootView UIHostingController в SceneDelegate,

Если вы хотите перейти к следующему экрану, вы можете использовать следующий рефакторинг вашего кода:

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
        }
    }
}
0 голосов
/ 21 ноября 2019

ContentView:

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

Ваш LoginView:

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)

  }
}
0 голосов
/ 21 ноября 2019

Я думаю, вы хотите что-то вроде этого:

import 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
        }
    }
}
...