2
votes

EDIT: Explanation to the problem

This code is producing an error where the poster doesn't know how to solve it.

This is a new edit of the previous post.

I received the error on >Geometry Reader. This post includes all of the code. This new post includes the Sign-Up and Login code as requested. I hope that it is in a readable format. I made some corrections that I hope will help. The code is listed below:

import SwiftUI

struct ContentView: View {

    var body: some View {
       
            Home()
                // for light status bar...
            .preferredColorScheme(.dark)
            
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
    struct Home : View {
        
        @State var index = 0
    
        var body: some View{
            
            GeometryReader{ _ in // ( ERROR MESSAGE OCCURS HERE)--> ("Type '()' cannot conform to'View'; only struct/enum/class types can conform to protocols" and  "Required by generic struct 'GeometryReader' where 'Content' = '()'")
            
                VStack{
                
                    Image("logo")
                    .resizable()
                    .frame(width:60, height: 60)
                      
                    ZStack{
                        
                        SignUp(index: self.$index)
                            *// changing view order...*
                            .zIndex(Double(self.index))
                        
                        Login(index: self.$index)
                        
                        
                    }
                    
                    HStack(spacing: 15){
                        
                        Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                        
                        Text("OR")
                        
                        Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                    }
                    .padding(.horizontal, 20)
                    .padding(.top, 50)
                    *// because login button is moved 25 in y axis and 25 padding = 50*
                  
                    
.background(Color("Orange").edgesIgnoringSafeArea(.all))
                    
                    
                    //Curve...
                    
                    HStack(spacing: 25){
                    
                        Button(action: {
                            
                        }) {
                                 Image("Unknown")
                                 .resizable()
                                 .renderingMode(.original)
                                 .frame(width: 50, height: 50)
                                 .clipShape(Circle())
                     }
                                 Button(action: {
                                 }) {
                                     
                                     Image("fb")
                                     .resizable()
                                     .renderingMode(.original)
                                     .frame(width: 50, height: 50)
                                     .clipShape(Circle())
                    }
                                     
                                     Button(action: {
                                     }) {
                                         
                                         Image("instagram")
                                         .resizable()
                                         .renderingMode(.original)
                                         .frame(width: 50, height: 50)
                                         .clipShape(Circle())
                                    
                            }
}
                    .padding(.top, 30)
                }
                .padding(.vertical)
                


struct CShape: Shape {
    func path(in rect: CGRect) -> Path {
        
        return Path {path in
            
            *//right side curve...*
            
            path.move(to: CGPoint(x: rect.width, y: 100))
            path.addLine(to: CGPoint(x: rect.width, y: rect.height))
            path.addLine(to: CGPoint(x: 0, y: rect.height))
            path.addLine(to: CGPoint(x: 0, y: 0))
        }
    
}
}
        
        
    struct CShape1: Shape {
        func path(in rect: CGRect) -> Path {
            
            return Path {path in
                
                *//left side curve...*
                
                path.move(to: CGPoint(x: 0, y: 100))
                path.addLine(to: CGPoint(x: 0, y: rect.height))
                path.addLine(to: CGPoint(x: rect.width, y: rect.height))
                path.addLine(to: CGPoint(x: rect.width, y: 0))
            }
        
    }
    }
                
struct Login : View {
            
            @State var email = ""
            @State var pass = ""
            @Binding var index : Int
            
            var body : some View {
                
                ZStack(alignment: .bottom) {
                    
                    VStack{
                        
                        HStack{
                            
                            VStack(spacing:10){
                                
                                Text("Login")
                                    .foregroundColor(self.index == 0 ? .white : .gray)
                                    .font(.title)
                                    .fontWeight(.bold)
                                
                                Capsule()
                                    .fill(self.index == 0 ? Color.blue : Color.clear)
                                    .frame(width:100, height: 5)
                            }
                            
                            Spacer(minLength:0)
                        }
                        .padding(.top, 30)// for top curve...
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "envelope")
                                .foregroundColor(Color("Blue"))
                           
                                TextField("Email Adress", text: self.$email)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 40)
                    
                    VStack{
                        
                        HStack(spacing:15){
                            
                            Image(systemName: "eye")
                            .foregroundColor(Color("Orange"))
                       
                            SecureField("Password", text: self.$pass)
                        }
                        Divider().background(Color.white.opacity(0.5))
                    }
                    .padding(.horizontal)
                    .padding(.top, 30)
                        
                        HStack{
                            
                            Spacer(minLength: 0)
                            
                            Button(action: {
                                
                            }) {
                                
                                Text("Forget Password?")
                                    .foregroundColor(Color.white.opacity(0.6))
                            }
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                    }
                    .padding()
                    // bottom padding...
                    .padding(.bottom, 65)
                    .background(Color("LightBlue"))
                    .clipShape(CShape())
                    .contentShape(CShape())
                    .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                    .onTapGesture{
                            
                        self.index = 0
                            
                    }
                    .cornerRadius(35)
                    .padding(.horizontal,20)
                    
                    // Button...
                    
                    Button(action: {
                        
                    }) {
                        
                        Text("LOGIN")
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .padding(.vertical)
                            .padding(.horizontal, 50)
                        .background(Color("LightBlue"))
                        .clipShape(Capsule())
                        // shadow ...
                            .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                    }
                    // moving view down...
                        .offset(y: 25)
                        .opacity(self.index == 0 ? 1 : 0)
                }
            }
        }
                
// SignUp Page...
        
struct SignUp : View {
                        
    @State var email = ""
    @State var pass = ""
    @State var Repass = ""
    @Binding var index: Int
                        
        var body : some View {
            
            ZStack(alignment: .bottom) {
                
                VStack{
                    
                    HStack{
                        
                        Spacer(minLength:0)
                        
                        VStack(spacing: 10){
                        
                            Text("SignUp")
                                .foregroundColor(self.index == 1 ? .white : .gray)
                                .font(.title)
                                .fontWeight(.bold)
                        
                            Capsule()
                                .fill(self.index == 1 ? Color.blue : Color.clear)
                                .frame(width:100, height: 5)
                        }
                    }
                    .padding(.top, 30)// for top curve...
                    VStack{
                        
                        HStack(spacing:15){
                            
                            Image(systemName: "envelope")
                            .foregroundColor(Color("Orange"))
                       
                            TextField("Email Adress", text: self.$email)
                        }
                        Divider().background(Color.white.opacity(0.5))
                    }
                    .padding(.horizontal)
                    .padding(.top, 40)
                
                    VStack{
                    
                    HStack(spacing:15){
                        
                        Image(systemName: "eye")
                        .foregroundColor(Color("Orange"))
                   
                        SecureField("Password", text: self.$pass)
                    }
                    Divider().background(Color.white.opacity(0.5))
                }
                    .padding(.horizontal)
                    .padding(.top, 30)
                    
                    // replacing forget password with reenter password...
                    // so same height will be maintained...
                    
                    VStack{
                         
                         HStack(spacing:15){
                             
                             Image(systemName: "eye")
                            .foregroundColor(Color("Orange"))
                        
                             SecureField("Password", text: self.$Repass)
                         }
                         Divider().background(Color.white.opacity(0.5))
                     }
                         .padding(.horizontal)
                         .padding(.top, 30)
                }
                .padding()
                // bottom padding...
                .padding(.bottom, 65)
                .background(Color("Blue"))
                .clipShape(CShape1())
                //clipping the content shape also for tap gesture...
                .contentShape(CShape1())
                // shadow...
                .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                .onTapGesture {
                    
                    self.index = 1
                    
                }
                .cornerRadius(35)
                .padding(.horizontal,20)
                
                *// Button...*
                
                Button(action: {
                    
                }) {
                    
                  Text("SIGNUP")
                    .foregroundColor(.white)
                    .fontWeight(.bold)
                    .padding(.vertical)
                    .padding(.horizontal, 50)
                    .background(Color("Blue"))
                    .clipShape(Capsule())
                    *// shadow ...*
                    .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                }
                *// moving view down...*
                    .offset(y: 25)
            *// hiding view when its in background...*
            *// only button...*
                    .opacity(self.index == 1 ? 1 : 0)

        }
    }
}

}
}

}

        
            
1
Can you please fix your code so we can run it? what you have posted is all over the place. Your problem seems easy to fix though.Muhand Jumah
If I take your code and fix the formatting it seems to work so what you have posted in other words is not reproducible.Muhand Jumah
I apologize that it was difficult to read. I took your corrections, I hope this is better. Thanks, Muhand!Sydney
Hello Sydney, and welcome to SO! I've tested your code, but I had to replace SignUp and Login with Text components since you didn't include their code in the question. The test ran for me without any errors. Is there a possibility that you could post the SignUp() and Login() View code? If so I'd be happy to get back to you tomorrow after work.Samuel-IH
@Sydney no worries at all. I agree with what Samuel-IH said. I have done the samething. I replaced the signup and login with Text() and it works perfectly fine. I suspect your issue is in the other views, it would be helpful if you comment one at a time and see which one is producing the bug and then post it that’s view’s code on here.Muhand Jumah

1 Answers

0
votes

So the problem in your code is that you are defining views inside a GeomtryReader and that's a big no no. So a fix would be to move the Login and Singup outside the GeomtryReader or even better and better practice is just create a new file for each view and add it's code in that file. For example one file for Login.swift and another for Register.swift and maybe another called Shapes which includes multiple shapes and exports them.

What you were doing is something similar to this

struct ContentView: View {
    var body: some View {
          GeomtryReader { _ in
                Text("test")

                // Here is where the bug would happen
                struct NewView: View {
                      var body: some View {
                            Text("Second View")
                      } 
                }
                //////////////////////////////////////
          }
    }
}

You can see if you copy and paste the above code it will generate the same error. What you should do is move NewView outside of GeomtryReader

Something like this

struct ContentView: View {
    var body: some View {
          return GeomtryReader { _ in
                Text("test")
          }
          
          // This will fix the error
          struct NewView: View {
                var body: some View {
                      Text("Second View")
                } 
          }
          //////////////////////////////////////
    }
}

Notice where I have moved the code. Also pay attention I have added Return to the GeomtryReader and that's because body is a computed property that expects to have a value of View but in this case we are confusing the compiler as to which View we want it to be the returned value so we have to manually specify it. If you don't want to include return then you would have to move NewView outside body or even better outside ContentView all together.

In any case here is your code working 100%, you can copy and paste it.

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        
        Home()
            // for light status bar...
            .preferredColorScheme(.dark)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct Home : View {
    
    @State var index = 0
    
    var body: some View{
        
        return GeometryReader{ _ in // ( ERROR MESSAGE OCCURS HERE)--> ("Type '()' cannot conform to'View'; only struct/enum/class types can conform to protocols" and  "Required by generic struct 'GeometryReader' where 'Content' = '()'")
            
            VStack{
                
                Image("logo")
                    .resizable()
                    .frame(width:60, height: 60)
                
                ZStack{
                    
                    SignUp(index: self.$index)
                        // changing view order...*
                        .zIndex(Double(self.index))
                    
                    Login(index: self.$index)
                    
                    
                }
                
                HStack(spacing: 15){
                    
                    Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                    
                    Text("OR")
                    
                    Rectangle()
                        .fill(Color("Blue"))
                        .frame(height: 1)
                }
                .padding(.horizontal, 20)
                .padding(.top, 50)
                    // because login button is moved 25 in y axis and 25 padding = 50*
                    
                    
                    .background(Color("Orange").edgesIgnoringSafeArea(.all))
                
                
//                Curve...
                
                HStack(spacing: 25){
                    
                    Button(action: {
                        
                    }) {
                        Image("Unknown")
                            .resizable()
                            .renderingMode(.original)
                            .frame(width: 50, height: 50)
                            .clipShape(Circle())
                    }
                    Button(action: {
                    }) {
                        
                        Image("fb")
                            .resizable()
                            .renderingMode(.original)
                            .frame(width: 50, height: 50)
                            .clipShape(Circle())
                    }
                    
                    Button(action: {
                    }) {
                        
                        Image("instagram")
                            .resizable()
                            .renderingMode(.original)
                            .frame(width: 50, height: 50)
                            .clipShape(Circle())
                        
                    }
                }
                .padding(.top, 30)
            }
            .padding(.vertical)
            
            
            
            
            
            
            
            
            
        }
        
        struct Login : View {
            
            @State var email = ""
            @State var pass = ""
            @Binding var index : Int
            
            var body : some View {
                
                ZStack(alignment: .bottom) {
                    
                    VStack{
                        
                        HStack{
                            
                            VStack(spacing:10){
                                
                                Text("Login")
                                    .foregroundColor(self.index == 0 ? .white : .gray)
                                    .font(.title)
                                    .fontWeight(.bold)
                                
                                Capsule()
                                    .fill(self.index == 0 ? Color.blue : Color.clear)
                                    .frame(width:100, height: 5)
                            }
                            
                            Spacer(minLength:0)
                        }
                            .padding(.top, 30)// for top curve...
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "envelope")
                                    .foregroundColor(Color("Blue"))
                                
                                TextField("Email Adress", text: self.$email)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 40)
                        
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "eye")
                                    .foregroundColor(Color("Orange"))
                                
                                SecureField("Password", text: self.$pass)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                        
                        HStack{
                            
                            Spacer(minLength: 0)
                            
                            Button(action: {
                                
                            }) {
                                
                                Text("Forget Password?")
                                    .foregroundColor(Color.white.opacity(0.6))
                            }
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                    }
                    .padding()
                        // bottom padding...
                        .padding(.bottom, 65)
                        .background(Color("LightBlue"))
                        .clipShape(CShape())
                        .contentShape(CShape())
                        .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                        .onTapGesture{
                            
                            self.index = 0
                            
                    }
                    .cornerRadius(35)
                    .padding(.horizontal,20)
                    
                    // Button...
                    
                    Button(action: {
                        
                    }) {
                        
                        Text("LOGIN")
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .padding(.vertical)
                            .padding(.horizontal, 50)
                            .background(Color("LightBlue"))
                            .clipShape(Capsule())
                            // shadow ...
                            .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                    }
                        // moving view down...
                        .offset(y: 25)
                        .opacity(self.index == 0 ? 1 : 0)
                }
            }
        }
        
        //SignUp Page...

        struct SignUp : View {
            
            @State var email = ""
            @State var pass = ""
            @State var Repass = ""
            @Binding var index: Int
            
            var body : some View {
                
                ZStack(alignment: .bottom) {
                    
                    VStack{
                        
                        HStack{
                            
                            Spacer(minLength:0)
                            
                            VStack(spacing: 10){
                                
                                Text("SignUp")
                                    .foregroundColor(self.index == 1 ? .white : .gray)
                                    .font(.title)
                                    .fontWeight(.bold)
                                
                                Capsule()
                                    .fill(self.index == 1 ? Color.blue : Color.clear)
                                    .frame(width:100, height: 5)
                            }
                        }
                            .padding(.top, 30)// for top curve...
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "envelope")
                                    .foregroundColor(Color("Orange"))
                                
                                TextField("Email Adress", text: self.$email)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 40)
                        
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "eye")
                                    .foregroundColor(Color("Orange"))
                                
                                SecureField("Password", text: self.$pass)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                        
                        // replacing forget password with reenter password...
                        // so same height will be maintained...
                        
                        VStack{
                            
                            HStack(spacing:15){
                                
                                Image(systemName: "eye")
                                    .foregroundColor(Color("Orange"))
                                
                                SecureField("Password", text: self.$Repass)
                            }
                            Divider().background(Color.white.opacity(0.5))
                        }
                        .padding(.horizontal)
                        .padding(.top, 30)
                    }
                    .padding()
                        // bottom padding...
                        .padding(.bottom, 65)
                        .background(Color("Blue"))
                        .clipShape(CShape1())
                        //clipping the content shape also for tap gesture...
                        .contentShape(CShape1())
                        // shadow...
                        .shadow(color: Color.black.opacity(0.3), radius: 5, x: 0, y: -5)
                        .onTapGesture {
                            
                            self.index = 1
                            
                    }
                    .cornerRadius(35)
                    .padding(.horizontal,20)
                    
                    // Button...*
                    
                    Button(action: {
                        
                    }) {
                        
                        Text("SIGNUP")
                            .foregroundColor(.white)
                            .fontWeight(.bold)
                            .padding(.vertical)
                            .padding(.horizontal, 50)
                            .background(Color("Blue"))
                            .clipShape(Capsule())
                            // shadow ...*
                            .shadow(color: Color.white.opacity(0.1), radius: 5, x: 0, y: 5)
                    }
                        // moving view down...*
                        .offset(y: 25)
                        // hiding view when its in background...*
                        // only button...*
                        .opacity(self.index == 1 ? 1 : 0)
                    
                }
            }
        }
        
        struct CShape: Shape {
            func path(in rect: CGRect) -> Path {
                
                return Path {path in
                    
                    //right side curve...*
                    
                    path.move(to: CGPoint(x: rect.width, y: 100))
                    path.addLine(to: CGPoint(x: rect.width, y: rect.height))
                    path.addLine(to: CGPoint(x: 0, y: rect.height))
                    path.addLine(to: CGPoint(x: 0, y: 0))
                }
                
            }
        }

        struct CShape1: Shape {
            func path(in rect: CGRect) -> Path {
                
                return Path {path in
                    
                    //left side curve...*
                    
                    path.move(to: CGPoint(x: 0, y: 100))
                    path.addLine(to: CGPoint(x: 0, y: rect.height))
                    path.addLine(to: CGPoint(x: rect.width, y: rect.height))
                    path.addLine(to: CGPoint(x: rect.width, y: 0))
                }
                
            }
        }
    }
    


}