Search code examples
iosswiftuisegmentedcontrol

Get string value from select UISegmentedControl segment


I've created a SignUp page (ViewController) and on gender selection I'm using a UISegmentedControl for "male", "female", "indifferent". But how can I get the value from the UISegmentedControl and put in a dictionary? I'm using a custom Dictionary<String, String> = [:] for signup but the UISegmentedControl is not a string (obviously) and I get the error:

Cannot assign value of type 'UISegmentedControl' to type 'String'

How can I convert the result of UISegmentedControl to receive those values?

import UIKit
import FirebaseAuth
import Firebase

class SignUpViewController: UIViewController{
    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var birthdayField: UITextField!
    @IBOutlet weak var passwordField: UITextField!
    @IBOutlet weak var confirmpasswordField: UITextField!
    @IBOutlet weak var instagramuserField: UITextField!
    @IBOutlet weak var generoSegmentControl: UISegmentedControl!
    @IBOutlet weak var DatePickerDate: UITextField!
    @IBOutlet weak var signupOutlet: UIButton!

    @IBAction func signupAction(_ sender: Any) {
        if let name = self.nameField.text {
            if let email = self.emailField.text {
                if let birthday = self.birthdayField.text {
                    if let password = self.passwordField.text {
                        if let confirmpassword = self.confirmpasswordField.text {
                            if let instagramuser = self.instagramuserField.text {
                                if let gender = self.generoSegmentControl {

                                    if password == confirmpassword {
                                        print("Senhas iguais, podemos seguir")
                                    }else {
                                        print("As senhas precisam ser iguais")
                                    }

                                    self.auth.createUser(withEmail: email, password: password) { (user, error) in

                                        if error == nil {

                                            var user: Dictionary<String, String> = [:]

                                            user["nome"] = name
                                            user["email"] =  email
                                            user["nascimento"] =  birthday
                                            user["instagram"] =  instagramuser
                                            user["genero"] = gender



                                            //Encoding email for Base 64
                                            let key = Base64().encodingStringBase64(text: email)

                                            let users = self.database.reference().child("usuarios")

                                            users.child(key).setValue(user)

                                            print("Sucesso ao cadastrar usuário!")
                                        }else{
                                            print("Erro ao cadastrar usuário, tente novamente!")
                                        }
                                    }
                                }else {
                                    print("Escolha seu genero")
                                }
                            }else{
                                print("O campo usuário do instagram esta vazio")
                            }
                        }else{
                            print("As senhas não conferem")
                        }
                    }else{
                        print("Digite uma senha")
                    }
                }else{
                    print("Digite a data do seu nascimento")
                }
            }else{
                print("Digite seu e-mail")
            }
        }else{
            print("Digite seu nome")
        }
    }

    @IBAction func generoAction(_ sender: Any) {
        let genIndex = generoSegmentControl.selectedSegmentIndex

        switch genIndex {
        case 0:
            print("Homem")
        case 1:
            print("Mulher")
        case 2:
            print("Indiferente")
        default:
            print("Nada selecionado")
        }
    }
}

Solution

  • You get the segmentedControl in your code, but not it's selectedSegmentIndex property. Then after receiving the selectedSegmentIndex, you should get the title for that index from control. Update your code with following:

    if let gender = self.generoSegmentControl {
    

    Either change it to:

    let genderIndex = self.generoSegmentControl.selectedSegmentIndex
    if let gender = self.generoSegmentControl.titleForSegment(at: genderIndex) {
    
    }
    

    OR change the way you update dictionary:

    let index = gender.selectedSegmentIndex
    if let segmentTitle = gender.titleForSegment(at: index) {
        user["nome"] = name
        user["email"] =  email
        user["nascimento"] =  birthday
        user["instagram"] =  instagramuser
        user["genero"] = segmentTitle
    }