【发布时间】:2021-05-12 08:27:02
【问题描述】:
尝试创建带有文本字段的入职视图流以捕获配置文件数据,并在最后一个视图中将数据存储在 Firestore 中。但是,需要将所有数据向下传递到最后一个视图才能使用此数据注册用户。
视图 0 具有用户名、电子邮件和密码 视图 1 有名字、姓氏和图像 视图 2 包含职位、公司名称
我能够将用户名、电子邮件和密码传递给 view 1,并将名字、姓氏和图像传递给 view 2。
我无法将图像传递给 view 3,因为它现在具有约束力,并且在“预览”中要求一个我无法弄清楚的参数。
我使用 .constant("") 传递的字符串绑定但是我该怎么做才能传递图像,请参见下面的代码。
```
import SwiftUI
struct Step1: View {
@State var firstname = ""
@State var lastname = ""
@Binding var email: String
@Binding var password:String
@Binding var username: String
@State var image: Image?
@State var showImagePicker = false
@State private var selectedImage: UIImage?
var body: some View {
VStack{
HStack{
VStack(alignment: .leading, spacing: 4) {
Text("Create profile")
.font(.system(size: 30))
.fontWeight(.bold)
Text("Basic profile information")
.font(.system(size: 18))
}
.padding(.horizontal, 32)
.padding(.bottom, 50)
.padding(.top, 50)
Spacer()
}
VStack(spacing: 20){
HStack{
if image != nil {
image?
.resizable()
.scaledToFill()
.frame(width: 80, height: 80)
.clipShape(RoundedRectangle(cornerRadius: 10.0))
} else {
Image("upload")
.resizable()
.scaledToFill()
.frame(width: 80, height: 80)
.clipShape(RoundedRectangle(cornerRadius: 10.0))
}
Spacer()
}
.onTapGesture {
self.showImagePicker = true
}
CustomTextField(text: $firstname, placeholder: Text("First name"), ImageName: "person")
.padding()
.background(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 0.2611568921)))
.cornerRadius(10)
CustomTextField(text: $lastname, placeholder: Text("Last name"), ImageName: "person")
.padding()
.background(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 0.2611568921)))
.cornerRadius(10)
}
.padding(.horizontal, 32)
Spacer()
NavigationLink(
destination: Step2(firstname: $email, lastname: $password, email: $username, password: $firstname, username: $lastname, image: $image)
.navigationBarBackButtonHidden(true)
.navigationTitle("")
.navigationBarHidden(true),
label: {
Text("Sign Up")
.font(.headline)
.foregroundColor(.white)
.frame(width:360, height: 50)
.background(Color(#colorLiteral(red: 0.03573478386, green: 0.4008729458, blue: 0.7616711259, alpha: 1)))
.cornerRadius(10)
.padding()
Spacer()
})
.navigationTitle("")
.navigationBarHidden(true)
}.sheet(isPresented: $showImagePicker, onDismiss: loadImage) {
ImagePicker(image: self.$selectedImage)
}
}
func loadImage() {
guard let selectedImage = selectedImage else { return }
image = Image(uiImage: selectedImage)
}
}
struct Step1_Previews: PreviewProvider {
static var previews: some View {
Step1(email: .constant(""), password: .constant(""), username: .constant(""))
}
}
```
```
import SwiftUI
struct Step2: View {
@Binding var firstname: String
@Binding var lastname: String
@Binding var email: String
@Binding var password:String
@Binding var username: String
@Binding var image: Image?
var body: some View {
VStack{
HStack{
VStack(alignment: .leading, spacing: 4) {
Text("Create profile")
.font(.system(size: 30))
.fontWeight(.bold)
Text("Basic profile information")
.font(.system(size: 18))
}
.padding(.horizontal, 32)
.padding(.bottom, 50)
.padding(.top, 50)
Spacer()
}
VStack(spacing: 20){
CustomTextField(text: $firstname, placeholder: Text("First name"), ImageName: "person")
.padding()
.background(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 0.2611568921)))
.cornerRadius(10)
CustomTextField(text: $lastname, placeholder: Text("Last name"), ImageName: "person")
.padding()
.background(Color(#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 0.2611568921)))
.cornerRadius(10)
}
.padding(.horizontal, 32)
Spacer()
.navigationTitle("")
.navigationBarHidden(true)
}
}
}
struct Step2_Previews: PreviewProvider {
static var previews: some View {
Step2(firstname: .constant(""), lastname: .constant(""), email: .constant(""), password: .constant(""), username: .constant(""), image: WHAT TO PUT HERE????)
}
}
```
【问题讨论】:
-
也手动传递这些数据。使用 ViewModel 类或 Environment 对象。
-
我在想,将变量设为 Environment 对象而不是使用 Bindings 传递它们是否更有意义?