簡體   English   中英

在 SwiftUI 中的視圖之間移動

[英]Moving between views in SwiftUI

好的,我在 SwiftUI Xcode 11.3.1 上嘗試在登錄后調用第二個視圖

第二個視圖的工作設計在文件 mainView.swift 中

登錄后,我像這樣調用我的視圖

Button(action: {
                self.status =  dologin(username: self.username, password: self.password)
                if (self.status){
                    print ("log in succesfull")
                    mainMenu() // <-- return of "mainMenu" initializer is unused

                }
            })

我知道你可以打電話給a。 .sheet(isPresented)這樣的子視圖,但這對我不起作用,因為是登錄屏幕。 提前致謝。

你需要在 SwiftUI 中以其他方式控制視圖,你不能像 UIKit 那樣只是pushpop視圖。 Apple 提出了NavigationView ,你可以使用NavigationLink(destination: YourLoginView(), isActive: $someBindingVariable, label: Text("")) ,但我真的不喜歡玩.navigationBarHidden(true).navigationBarBackButtonHidden(true)和其他工作人員。 有一些選擇:

  1. 使用.popover(isPresented: $needToLogin) { // login view } 您可以使用.sheet 在這種情況下,用戶可以將您的“登錄視圖”移動到底部並像往常一樣使用“主視圖”:
struct MovingViewsSwiftUI: View {

    @State private var needToLogin = true
    var body: some View {
        Rectangle() // your "Main view"
            .popover(isPresented: $needToLogin) {
                LoginView(needToLogin: self.$needToLogin) // will show you at the end
        }

    }

}
  1. 您可以使用if...else語句,例如:
//...
var body: some View {
    if needToLogin {
        return AnyView(LoginView)
    } else {
        return AnyView(MainView)
    }
    // something else in body
}
  1. 您可以使用ZStack並控制視圖.opacity.offset 它允許您實現有趣的動畫:
struct MovingViewsSwiftUI: View {

    @State private var needToLogin = true
    var body: some View {

        ZStack {
            LoginView(needToLogin: $needToLogin)
                .opacity(needToLogin ? 1 : 0)

            Rectangle()
                .opacity(needToLogin ? 0 : 1)

        }

    }

}

這是LoginView的示例:

struct LoginView: View {

    @Binding var needToLogin: Bool
    @State private var email: String = ""
    @State private var password: String = ""

    var body: some View {
        VStack {
            TextField("enter email", text: $email)
            TextField("pass", text: $password)

            Button(action: {
                withAnimation {
                    self.needToLogin = false
                }

            }) {
                Text("Log in!")
            }
        }
        .padding()
    }
}

您還可以像這樣在 NaigationView 中添加按鈕。

 NavigationLink(destination: mainMenu()) {
                            Button(action: {

                            }) {
                              Text("Log in!")
                            }
                        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM