[英]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 那樣只是push
或pop
視圖。 Apple 提出了NavigationView
,你可以使用NavigationLink(destination: YourLoginView(), isActive: $someBindingVariable, label: Text(""))
,但我真的不喜歡玩.navigationBarHidden(true)
和.navigationBarBackButtonHidden(true)
和其他工作人員。 有一些選擇:
.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
}
}
}
if...else
語句,例如://...
var body: some View {
if needToLogin {
return AnyView(LoginView)
} else {
return AnyView(MainView)
}
// something else in body
}
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.