【问题标题】:How to bind an image to the next view in SwiftUI?如何将图像绑定到 SwiftUI 中的下一个视图?
【发布时间】: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 传递它们是否更有意义?

标签: ios swift xcode swiftui


【解决方案1】:

您可以使用.constant(Image(uiImage: UIImage())) 或设置像.constant(Image("image_name"))) 这样的任何静态图像

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多