Ios 按按钮时在视图之间交换-快捷界面

Ios 按按钮时在视图之间交换-快捷界面,ios,swift,swiftui,Ios,Swift,Swiftui,我是swift的初学者,我想在两个视图之间交换。 这是我目前的代码 我试着看其他stackoverflow问题,但我不明白什么是viewcontroller或任何东西,所以如果你回答了,请解释一下它的作用 我只想在按下注册按钮时从ContentView切换到MessageView,但我根本不知道如何实现这一点 导入快捷界面 结构ContentView:View{ @国家私有变量用户名:String=“” @国家私有变量密码:String=“” var body:一些观点{ VStack{ 文本(

我是swift的初学者,我想在两个视图之间交换。 这是我目前的代码

我试着看其他stackoverflow问题,但我不明白什么是viewcontroller或任何东西,所以如果你回答了,请解释一下它的作用

我只想在按下注册按钮时从ContentView切换到MessageView,但我根本不知道如何实现这一点

导入快捷界面
结构ContentView:View{
@国家私有变量用户名:String=“”
@国家私有变量密码:String=“”
var body:一些观点{
VStack{
文本(“创建帐户”)
文本字段(“用户名”,文本:$Username)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(宽度:250,高度:/*@START\u MENU\u TOKEN@*/100/*@END\u MENU\u TOKEN@*/)
SecureField(“密码”,文本:$Password)
.textFieldStyle(RoundedBorderTextFieldStyle())
.frame(宽度:250,高度:/*@START\u MENU\u TOKEN@*/100/*@END\u MENU\u TOKEN@*/)
让按钮=按钮(“注册!”){
如果(用户名=“”| |密码=“”){
打印(“无用户名或密码”)
}否则{
打印(“用户”,用户名)
打印(“密码”,密码)
}
}
按钮。转弯半径(5.0)
}
}
}
结构MessageView:View{
var body:一些观点{
导航视图{
名单{
文本(“FortniteGamer123”)
文本(“fortnitepickid”)
文本(“KidIsGoodAtFortnite”)
}
}.navigationTitle(“Fortnite玩家”)
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}

如果有人能在视图控制器以及如何使用它们方面给我一些帮助,那就太好了。

您使用的是SwiftUI,它实际上没有视图控制器(或者至少是UIViewController)的概念,而视图控制器更多的是UIKit的一部分

相反,SwiftUI是由多组可组合视图组成的。您已经定义了两个视图(如ContentView和MessageView),并且正在使用一组内置的SwiftUI视图(如TextField、Text、Button等)

要在视图之间切换,可以使用依赖于@State变量的
if
语句

我对内容进行了一些重构,使
LoginView
MessageView
由父视图(
ContentView
)根据
loggedIn
的状态显示。这是通过
绑定
传递到LoginView的,这样当按下按钮时,该值可以被传递回父级

struct ContentView: View { //parent view
    @State var loggedIn = false //state variable
    
    var body: some View {
        if loggedIn { //'if' condition
            MessageView()
        } else {
            LoginView(loggedIn: $loggedIn) //passing loggedIn with the $ sign makes it a two-way binding where the child view can now have access to and change the variable
        }
    }
}

struct LoginView : View {
    @Binding var loggedIn : Bool //this is how loggedIn gets passed in
    @State private var username: String = ""
    @State private var password: String = ""
    
    var body: some View {
        VStack {
            Text("Create an account.")
            TextField("Username", text: $username)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .frame(width: 250, height: 100)
            SecureField("Password", text: $password)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .frame(width: 250, height: 100)
            Button(action: {
                if(username == "" || password == "") {
                    print("no suername or password")
                } else {
                    print("user", username)
                    print("password", password)
                    loggedIn = true //set the binding to true, which will effect the parent view
                }
            }) {
                Text("Sign Up!")
            }
            .padding()
            .overlay(RoundedRectangle(cornerRadius: 5.0).stroke(Color.accentColor)) //using this to round the corners
        }
    }
}
从技术上讲,您也可以通过使用
NavigationView
NavigationLink
来实现这一点,但这会导致用户点击后退按钮返回登录屏幕的情况,而这在iOS中并不是您真正看到的情况,所以我从字面上理解了你的标题,关于在两个视图之间交换


我对您的其他代码做了一些非常小的编辑。例如,在我已经调整了的视图层次结构中,有一个<代码>让按钮= < /COD>——通常在SwiftUI,您将不会定义捕获视图的变量——相反,您只需在层次结构中定义它们。

< P>在SWIFT中,我们有两个主要的框架来构建IOS应用:UIKIT和SwiftUI。第一个是命令式的,第二个是声明式的。在UIKit中,我们使用控制器和视图类来创建UI,在SwiftUI中,我们使用视图结构来声明我们希望用户界面如何显示。在这种情况下,SwiftUI基本上类似于React/React Native和Flatter。在您的示例中,您使用的是SwiftUI,因此需要声明状态变量并基于此变量值显示视图,例如使用
.sheet(isPresented:)
或if语句。您还可以使用NavigationView和导航链接