如何在SwiftUI中将图像绑定到下一个视图?

3

尝试创建一个包含文本字段的视图引导流,以捕获个人资料数据,并在最后一个视图中将数据存储在Firestore中。但是,需要将所有数据传递到最后一个视图,以使用这些数据注册用户。

视图0具有用户名、电子邮件和密码 视图1具有名字、姓氏和图像 视图2具有职位标题和公司名称

我能够将用户名、电子邮件和密码传递到视图1,并将名字、姓氏和图像传递到视图2

我不能将图像传递到视图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对象。 - Raja Kishan
我在思考,将变量设置为环境对象而不是使用 Bindings 将它们传递下去是否更有意义? - Kevin
1个回答

3
您可以使用 .constant(Image(uiImage: UIImage())) 或设置任何静态图像,例如 .constant(Image("image_name"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接