Plusieurs Picker view swift 3

Bonjour a tous le monde,


 


Je cherche a réaliser une storyboard pour des avis avec des étoiles comprenant 5 questions ou l'on répond de 1 étoile à  5 étoiles, on clique sur la ligne et ça dois ouvrir un  Pickerview cacher.


 


Ce que j'ai put faire mais je n'arrive pas déjà  :


 


- A cacher mon Pickerview.


- A en avoir plusieurs qui font appel a textfield différent pour prendre en compte chaque ligne sélectionner.


 


Merci de votre aide,


Réponses

  • CéroceCéroce Membre, Modérateur
    Bonjour,

    On peut utiliser la propriété .inputView de UITextField pour que s'affiche une PickerView au lieu du clavier. Elle disparaitra automatiquement quand le text field ne sera plus first responder (perdra le focus).
  • easydeasyd Membre
    novembre 2016 modifié #3

    Merci encore de ton aide cela ma aider a avancer vers une solution, mais je bloque encore.


     


    Voilà  mon code :




    import UIKit

    class YourOpinionViewController: UIViewController, UIPickerViewDelegate {

    @IBOutlet var pickerView0: UIPickerView!
    @IBOutlet var pickerView1: UIPickerView!
    @IBOutlet var pickerView2: UIPickerView!
    @IBOutlet var pickerView3: UIPickerView!
    @IBOutlet var pickerView4: UIPickerView!

    @IBOutlet var textField0: UITextField!
    @IBOutlet var textField1: UITextField!
    @IBOutlet var textField2: UITextField!
    @IBOutlet var textField3: UITextField!
    @IBOutlet var textField4: UITextField!

    var pickerData0 = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]
    var pickerData1 = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]
    var pickerData2 = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]
    var pickerData3 = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]
    var pickerData4 = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]

    override func viewDidLoad() {

    super.viewDidLoad()

    pickerView0 = UIPickerView()
    pickerView1 = UIPickerView()
    pickerView2 = UIPickerView()
    pickerView3 = UIPickerView()
    pickerView4 = UIPickerView()

    pickerView0.delegate = self
    pickerView1.delegate = self
    pickerView2.delegate = self
    pickerView3.delegate = self
    pickerView4.delegate = self

    textField0.inputView = self.pickerView0;
    textField1.inputView = self.pickerView1;
    textField2.inputView = self.pickerView2;
    textField3.inputView = self.pickerView3;
    textField4.inputView = self.pickerView4;
    }

    func numberOfComponentsInPickerView(_ pickerView: UIPickerView) -> Int {
    return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    //pickerView1.tag = 0


    if pickerView0.tag == 0 {
    return pickerData0.count

    } else if pickerView1.tag == 1 {
    return pickerData1.count

    } else if pickerView2.tag == 2 {
    return pickerData2.count

    } else if pickerView3.tag == 3 {
    return pickerData3.count

    } else if pickerView4.tag == 4 {
    return pickerData4.count
    }
    return 1
    }


    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    if pickerView0.tag == 0 {
    return pickerData0[row]

    } else if pickerView1.tag == 1 {
    return pickerData1[row]

    } else if pickerView2.tag == 2 {
    return pickerData2[row]

    } else if pickerView3.tag == 3 {
    return pickerData3[row]

    } else if pickerView4.tag == 4 {
    return pickerData4[row]
    }
    return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if pickerView0.tag == 0 {
    textField0.text = pickerData0[row]

    } else if pickerView1.tag == 1 {
    textField1.text = pickerData1[row]

    } else if pickerView2.tag == 2 {
    textField2.text = pickerData2[row]

    } else if pickerView3.tag == 3 {
    textField3.text = pickerData3[row]

    } else if pickerView4.tag == 4 {
    textField4.text = pickerData4[row]
    }
    }
    }

    Puis comment faire pour récupérer un chiffre quant on sélectionne une étoile = 1 puis   deux  étoile = 2 etc ...


     


    Merci de votre aide,


  • CéroceCéroce Membre, Modérateur
    novembre 2016 modifié #4
    - @IBOutlet informe qu'il s'agit d'une référence vers un objet instancié dans le Storyboard/xib. Ce n'est pas le cas pour les UIPickerViews, qui sont instanciées dans viewDidLoad()

    - Ecris let pickerData = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"] parce que c'est toujours la même chose

    - une seule UIPickerView suffit, puisqu'il n'y en a qu'une seule affichée à  tout moment

    - pour avoir un code un peu plus propre, tu pourrais mettre tout ce qui est relatif à  UIPickerViewDelegate dans une extension à  YourOpinionViewController.
     
            if pickerView0.tag == 0 {
    return pickerData0.count
    Là  se trouve le plus gros du soucis. Ton problème est qu'il te faut un endroit où stocker les données. ça se fait dans un Modèle (étudie l'architecture Model-View-Controller).
    Par exemple, on peut définir ça:


    class Opinion {
    var rating0: Int
    var rating1: Int
    etc.
    }
    Il faut instancier ce modèle quelque part. Pour commencer, fais-le dans viewDidLoad(). Ensuite, tu devras le faire par exemple dans l'AppDelegate et le passer jusqu'au ViewController.
     
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    Combien de lignes dans la picker view ? Réponse: 5 (une pour chaque nombre d'étoiles) soit pickerData.count
     
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    Quel est le texte affiché pour cette ligne ?
     
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    L'utilisateur a choisi une nouvelle ligne. -> Prendre son index; ça correspond à  la note, à  écrire dans l'Opinion.

    Enfin, il reste un détail: quand la UIPickerView est sur le point de s'afficher, il faut changer la ligne sélectionnée, pour que ça corresponde à  la note.
    On peut le faire à  plusieurs endroits, mais je crois que je mettrais des actions sur les text fields, actionnées quand ils prennent le focus.

    Pour l'instant, je ne te file pas le code, pour que tu progresses.
  • easydeasyd Membre
    novembre 2016 modifié #5

    Bonjour,


     


    Je demande de l'aide je n'y arrive pas ça sauvegarde pas a chaque changement de ligne.


    Voilà  mon code changer :




    import UIKit

    //class YourOpinionViewController: UIViewController {
    class YourOpinionViewController: UIViewController, UIPickerViewDelegate
    {

    var pickerView0: UIPickerView!
    var pickerView1: UIPickerView!
    var pickerView2: UIPickerView!
    var pickerView3: UIPickerView!
    var pickerView4: UIPickerView!

    @IBOutlet weak var textField0: UITextField!
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!
    @IBOutlet weak var textField3: UITextField!
    @IBOutlet weak var textField4: UITextField!

    var pickerData:Array<String>?

    override func viewDidLoad() {
    super.viewDidLoad()

    pickerView0 = UIPickerView()
    pickerView1 = UIPickerView()
    pickerView2 = UIPickerView()
    pickerView3 = UIPickerView()
    pickerView4 = UIPickerView()

    pickerView0.delegate = self
    pickerView1.delegate = self
    pickerView2.delegate = self
    pickerView3.delegate = self
    pickerView4.delegate = self

    self.textField0.inputView = pickerView0;
    self.textField1.inputView = pickerView1;
    self.textField2.inputView = pickerView2;
    self.textField3.inputView = pickerView3;
    self.textField4.inputView = pickerView4;

    //popDatePicker = pickerData(forTextField: dobTextField)
    //popDatePicker = PopDatePicker(forTextField: dobTextField)

    pickerData = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]

    }


    func numberOfComponentsInPickerView(_ pickerView: UIPickerView) -> Int {
    return 1
    }

    override func touchesBegan(_ pickerView: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    if pickerView0.tag == 0 {
    return pickerData!.count

    } else if pickerView1.tag == 1 {
    return pickerData!.count

    } else if pickerView2.tag == 2 {
    return pickerData!.count

    } else if pickerView3.tag == 3 {
    return pickerData!.count

    } else if pickerView4.tag == 4 {
    return pickerData!.count
    }
    return 1
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    if pickerView0.tag == 0 {
    return pickerData?[row]

    } else if pickerView1.tag == 1 {
    return pickerData?[row]

    } else if pickerView2.tag == 2 {
    return pickerData?[row]

    } else if pickerView3.tag == 3 {
    return pickerData?[row]

    } else if pickerView4.tag == 4 {
    return pickerData?[row]
    }
    return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if pickerView0.tag == 0 {
    textField0.text = pickerData?[row]

    } else if pickerView1.tag == 1 {
    textField1.text = pickerData?[row]

    } else if pickerView2.tag == 2 {
    textField2.text = pickerData?[row]

    } else if pickerView3.tag == 3 {
    textField3.text = pickerData?[row]

    } else if pickerView4.tag == 4 {
    textField4.text = pickerData?[row]
    }
    }
    }



    Merci a vous,


  • Joanna CarterJoanna Carter Membre, Modérateur
    Pourquoi tu utilises les tags ?
  • C'est un exemple que j'ai pris et travailler dessus.


  • Pour func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int et func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? tu renvoies la même chose, pas besoin de faire des if/else.

    Pour func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int), comme l'a signalé @Joanna Carter, étant donné que tu connais tes pickerView, compare juste pickerView et pickerView0, pickerView1, etc, sans passer par les tags.


  • easydeasyd Membre
    février 2017 modifié #9

    Je vient de faire ces modifications :



    import UIKit

    //class YourOpinionViewController: UIViewController {
    class YourOpinionViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    var pickerView0: UIPickerView!
    var pickerView1: UIPickerView!
    var pickerView2: UIPickerView!
    var pickerView3: UIPickerView!
    var pickerView4: UIPickerView!


    @IBOutlet weak var textField0: UITextField!
    @IBOutlet weak var textField1: UITextField!
    @IBOutlet weak var textField2: UITextField!
    @IBOutlet weak var textField3: UITextField!
    @IBOutlet weak var textField4: UITextField!

    var pickerData = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]

    override func viewDidLoad() {

    super.viewDidLoad()

    pickerView0 = UIPickerView()
    pickerView1 = UIPickerView()
    pickerView2 = UIPickerView()
    pickerView3 = UIPickerView()
    pickerView4 = UIPickerView()

    pickerView0.delegate = self
    pickerView1.delegate = self
    pickerView2.delegate = self
    pickerView3.delegate = self
    pickerView4.delegate = self

    self.textField0.inputView = pickerView0;
    self.textField1.inputView = pickerView1;
    self.textField2.inputView = pickerView2;
    self.textField3.inputView = pickerView3;
    self.textField4.inputView = pickerView4;

    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
    }

    override func touchesBegan(_ pickerView: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return pickerData[row]
    }


    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
    Je comprend que cette partie correspond a l\'affichage, mais ni arrive pas :-(

    }

    }

  • Bonjour,


     


    Comme personne ne te l'a dit, je m'y colle :


    En tant que nouveau membre, il est préférable de passer par la case Présentation afin que l'on puisse mieux connaà®tre ta formation, ton niveau, etc...


  • OK pas de problème,


     


    Merci,


  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2016 modifié #12

    Régales-toi



    class ViewController: UIViewController
    {
    let pickerData = ["", "☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]

    lazy var pickerView: UIPickerView =
    {
    let pickerView = UIPickerView()

    pickerView.dataSource = self

    pickerView.delegate = self

    return pickerView
    }()

    @IBOutlet var textFields: [UITextField]!

    var currentTextField: UITextField?

    override func viewDidLoad()
    {
    super.viewDidLoad()

    for textField in self.textFields
    {
    textField.delegate = self

    textField.inputView = pickerView
    }
    }

    @IBAction func tapView(_ sender: UITapGestureRecognizer)
    {
    self.currentTextField?.endEditing(true)
    }
    }

    extension ViewController : UIPickerViewDataSource
    {
    func numberOfComponents(in pickerView: UIPickerView) -> Int
    {
    return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {
    return self.pickerData.count
    }
    }

    extension ViewController : UIPickerViewDelegate
    {
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
    return self.pickerData[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
    self.currentTextField?.text = pickerData[row]

    self.currentTextField?.endEditing(true)
    }
    }

    extension ViewController : UITextFieldDelegate
    {
    func textFieldDidBeginEditing(_ textField: UITextField)
    {
    self.currentTextField = textField

    self.pickerView.selectRow(pickerData.index(of: self.currentTextField?.text ?? "")!, inComponent: 0, animated: false)
    }

    func textFieldDidEndEditing(_ textField: UITextField)
    {
    self.currentTextField = nil
    }
    }
  • Bonjour,


     


    Déjà  merci de votre aide et en plus je suis des cours swift 3 UDEMY, c'est pour cela que je suis novice, cette aide m'apporte beaucoup.


    Plus on est aider et que l'on avance avec l'expérience des autres et plus en apprend.


     


    Voilà  ce que je voulais vous dire en temps de nouveaux.


     


    Pour le code merci, mais j'ai des erreurs que je ne comprend pas :


     


     


    hyso.png


     


     


    9tuy.png


     


     


    Voilà ,

  • Super je pense que j'ai trouver merci encore, 


     


    Je placerai le code est le cheminement pour d'autre que moi.


     


    Super forum,


  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2016 modifié #15


    Pour le code merci, mais j'ai des erreurs que je ne comprend pas


    Les erreurs se produisent parce que tu as dérivé ta classe de YourOpinionViewController mais tu as créé les extensions sur ViewController. Il faut étendre la même classe.


    Attention de ne pratiquer que le copie/colle sans avoir entendu ce que tu fasses.
  • Merci,


     


    J'ai fait quelque changement maintenant pour finaliser le code je voudrais envoyer cela a mon serveur via un json, pour écrire dans ma BDD MYSQL.




    import UIKit


     


    class YourOpinionViewController: UIViewController {


     


        let pickerData = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]


        


        lazy var pickerView: UIPickerView =


            {


                let pickerView = UIPickerView()


                pickerView.dataSource = self


                pickerView.delegate = self


                return pickerView


        }()


        


        @IBOutlet var textFields: [UITextField]!


        var currentTextField: UITextField?


        


        override func viewDidLoad()


        {


            super.viewDidLoad()


            


            for textField in self.textFields


            {


                textField.delegate = self


                textField.inputView = pickerView


            }


        }


        


        @IBAction func signinTapped(_ sender : UIButton) {


            let textfield0:NSString = textFields[0].text! as NSString


            let textfield1:NSString = textFields[1].text! as NSString


            let textfield2:NSString = textFields[2].text! as NSString


            let textfield3:NSString = textFields[3].text! as NSString


            let textfield4:NSString = textFields[4].text! as NSString


            


            if ( textfield0.isEqual(to: "") || textfield1.isEqual(to: "") || textfield2.isEqual(to: "") || textfield3.isEqual(to: "") || textfield4.isEqual(to: "")) {


                


                let alertView:UIAlertController = UIAlertController()


                alertView.title = "Sign in Failed!"


                alertView.message = "Please enter Username and Password"


           


            } else {


                


                do {


                    let post:NSString = "textfield0=\(textfield0)&textfield1=\(textfield1)&textfield2=\(textfield2)&textfield3=\(textfield3)&textfield4=\(textfield4)" as NSString


                    


                    NSLog("PostData: %@",post);


                    


                    let url:URL = URL(string:"http://MON_SERVEUR/MON_FICHIER.php")!


                    


                    let postData:Data = post.data(using: String.Encoding.ascii.rawValue)!


                    


                    let postLength:NSString = String( postData.count ) as NSString


                    


                    let request:NSMutableURLRequest = NSMutableURLRequest(url: url)


                    request.httpMethod = "POST"


                    request.httpBody = postData


                    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")


                    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")


                    request.setValue("application/json", forHTTPHeaderField: "Accept")


                    


                    


                    var reponseError: NSError?


                    var response: URLResponse?


                    


                    var urlData: Data?


                    do {


                        urlData = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response)


                    } catch let error as NSError {


                        reponseError = error


                        urlData = nil


                    }


                    


                    if ( urlData != nil ) {


                        let res = response as! HTTPURLResponse!;


                        


                        //     NSLog("Response code: %ld", res?.statusCode);


                        


                        if ((res?.statusCode)! >= 200 && (res?.statusCode)! < 300)


                        {


                            let responseData:NSString  = NSString(data:urlData!, encoding:String.Encoding.utf8.rawValue)!


                            


                            NSLog("Response ==> %@", responseData);


                            


                            //var error: NSError?


                            


                            let jsonData:NSDictionary = try JSONSerialization.jsonObject(with: urlData!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary


                            


                            


                            let success:NSInteger = jsonData.value(forKey: "success") as! NSInteger


                            


                            NSLog("Success: %ld", success);


                            


                            if(success == 1)


                            {


                                NSLog("YOUR OPINION SUCCESS");


                                


                                let prefs:UserDefaults = UserDefaults.standard


                                prefs.set(1, forKey: "ISLOGGEDIN")


                                prefs.synchronize()


                                


                                self.dismiss(animated: true, completion: nil)


                            } else {


                                var error_msg:NSString


                                


                                if jsonData["error_message"] as? NSString != nil {


                                    error_msg = jsonData["error_message"] as! NSString


                                } else {


                                    error_msg = "Unknown Error"


                                }


                                


                                let alert = UIAlertController(title: "Error", message: "Sign in Failed", preferredStyle: .alert)


                                alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))


                                self.present(alert, animated: true, completion: nil)


                            }


                            


                        } else {


                            let alert = UIAlertController(title: "Error", message: "Sign in Failed!", preferredStyle: .alert)


                            alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))


                            self.present(alert, animated: true, completion: nil)


                        }


                    } else {


                        let alertView:UIAlertController = UIAlertController()


                        alertView.title = "Sign in Failed!"


                        alertView.message = "Connection Failure"


                        if let error = reponseError {


                            alertView.message = (error.localizedDescription)


                        }


                        


                    }


                } catch {


                    let alert = UIAlertController(title: "Error", message: "Sign in Failed!", preferredStyle: .alert)


                    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))


                    self.present(alert, animated: true, completion: nil)


                    


                }


            }


        }


        


        @IBAction func tapView(_ sender: UITapGestureRecognizer)


        {


            self.currentTextField?.endEditing(true)


        }


    }


     


    extension YourOpinionViewController : UIPickerViewDataSource


    {


        func numberOfComponents(in pickerView: UIPickerView) -> Int


        {


            return 1


        }


        


        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int


        {


            return self.pickerData.count


        }


    }


     


    extension YourOpinionViewController : UIPickerViewDelegate


    {


        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?


        {


            return self.pickerData[row]


        }


        


        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)


        {


            self.currentTextField?.text = pickerData[row]


            


            self.currentTextField?.endEditing(true)


        }


    }


     


    extension YourOpinionViewController : UITextFieldDelegate


    {


        func textFieldDidBeginEditing(_ textField: UITextField)


        {


            self.currentTextField = textField


            self.pickerView.selectRow(pickerData.index(of: self.currentTextField?.text ?? "")!, inComponent: 0, animated: false)


        }


        


        func textFieldDidEndEditing(_ textField: UITextField)


        {


            self.currentTextField = nil


        }


        


    }


    Cela me donne bien 


     




    PostData: textfield0=☆☆☆&textfield1=☆&textfield2=☆☆☆&textfield3=☆☆☆☆☆&textfield4=☆


     


    Mais je voudrez modifier mais étoiles en chiffre, comment puis-je faire ??


     


    Merci a vous,


     


    P.S après je mets mon code et le php au complet pour les autres.


     

     


     


  • Plutôt que de faire ça : let post:NSString = "textfield0=\(textfield0)&textfield1=\(textfield1)&textfield2=\(textfield2)&textfield3=\(textfield3)&textfield4=\(textfield4)" as NSString, mets sa length plutôt que sa valeur.


     


    Ensuite, vu que tu fais du Swift 3, je conseillerais de te passer des (NS) et autres trucs plus "Objective-C".


  • Voilà , 


     


    ça fonctionne très bien



    let post:String = "textfield0=\(textfield0.length)&textfield1=\(textfield1.length)&textfield2=\(textfield2.length)&textfield3=\(textfield3.length)&textfield4=\(textfield4.length)" as String

    Merci a toi,

  • J'ai regardé vite fait, mais le fait que ton gros morceau de code ne soit pas entre balise CODE rend la tâche un peu moins évidente, mais, tu devrais revoir ton système d'erreur (le UIAlertController), car il y a vraiment beaucoup de recopie de code là , il serait plus intéressant au moins de créer une fonction qui prend en paramètre un string (raison du message d'erreur) et qui créé l'alerte directement mettant le message s'il est fourni et l'affiche.


  • Voilà  mon code :



    import UIKit

    class YourOpinionViewController: UIViewController {

    let pickerData = ["☆", "☆☆", "☆☆☆", "☆☆☆☆", "☆☆☆☆☆"]

    lazy var pickerView: UIPickerView =
    {
    let pickerView = UIPickerView()
    pickerView.dataSource = self
    pickerView.delegate = self
    return pickerView
    }()

    @IBOutlet var textFields: [UITextField]!
    var currentTextField: UITextField?

    override func viewDidLoad()
    {
    super.viewDidLoad()

    for textField in self.textFields
    {
    textField.delegate = self
    textField.inputView = pickerView
    }
    }

    @IBAction func signinTapped(_ sender : UIButton) {
    let textfield0:NSString = textFields[0].text! as NSString
    let textfield1:NSString = textFields[1].text! as NSString
    let textfield2:NSString = textFields[2].text! as NSString
    let textfield3:NSString = textFields[3].text! as NSString
    let textfield4:NSString = textFields[4].text! as NSString



    if ( textfield0.isEqual(to: "") || textfield1.isEqual(to: "") || textfield2.isEqual(to: "") || textfield3.isEqual(to: "") || textfield4.isEqual(to: "")) {

    let alertView:UIAlertController = UIAlertController()
    alertView.title = "Sign in Failed!"
    alertView.message = "Please enter Username and Password"
    // alertView.delegate = self
    //alertView.addButton(withTitle: "OK")
    // alertView.show()
    } else {

    do {

    let post:String = "textfield0=\(textfield0.length)&textfield1=\(textfield1.length)&textfield2=\(textfield2.length)&textfield3=\(textfield3.length)&textfield4=\(textfield4.length)&id_user_avis=\(1)&id_agence=\(10)" as String

    NSLog("PostData: %@",post);


    let url:URL = URL(string:"http://46.255.160.74/ios_app/api/your_opinion.php")!

    let postData:Data = post.data(using: String.Encoding(rawValue: String.Encoding.ascii.rawValue))!

    let postLength:NSString = String( postData.count ) as NSString

    let request:NSMutableURLRequest = NSMutableURLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = postData
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")


    var reponseError: NSError?
    var response: URLResponse?

    var urlData: Data?
    do {
    urlData = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response)
    } catch let error as NSError {
    reponseError = error
    urlData = nil
    }

    if ( urlData != nil ) {
    let res = response as! HTTPURLResponse!;

    // NSLog("Response code: %ld", res?.statusCode);

    if ((res?.statusCode)! >= 200 && (res?.statusCode)! < 300)
    {
    let responseData:NSString = NSString(data:urlData!, encoding:String.Encoding.utf8.rawValue)!

    NSLog("Response ==> %@", responseData);

    //var error: NSError?

    let jsonData:NSDictionary = try JSONSerialization.jsonObject(with: urlData!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary


    let success:NSInteger = jsonData.value(forKey: "success") as! NSInteger

    NSLog("Success: %ld", success);

    if(success == 1)
    {
    NSLog("YOUR OPINION SUCCESS");

    let prefs:UserDefaults = UserDefaults.standard
    prefs.set(1, forKey: "ISLOGGEDIN")
    prefs.synchronize()

    self.dismiss(animated: true, completion: nil)
    } else {
    var error_msg:NSString

    if jsonData["error_message"] as? NSString != nil {
    error_msg = jsonData["error_message"] as! NSString
    } else {
    error_msg = "Unknown Error"
    }

    let alert = UIAlertController(title: "Sign in Failed!", message: "Invalid Username / Password", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
    self.present(alert, animated: true, completion: nil)
    }

    } else {
    let alert = UIAlertController(title: "Error", message: "Sign in Failed!", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
    self.present(alert, animated: true, completion: nil)
    }
    } else {
    let alertView:UIAlertController = UIAlertController()
    alertView.title = "Sign in Failed!"
    alertView.message = "Connection Failure"
    if let error = reponseError {
    alertView.message = (error.localizedDescription)
    }

    }
    } catch {
    let alert = UIAlertController(title: "Error", message: "Sign in Failed!", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
    self.present(alert, animated: true, completion: nil)

    }
    }
    }

    @IBAction func tapView(_ sender: UITapGestureRecognizer)
    {
    self.currentTextField?.endEditing(true)
    }
    }

    extension YourOpinionViewController : UIPickerViewDataSource
    {
    func numberOfComponents(in pickerView: UIPickerView) -> Int
    {
    return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {
    return self.pickerData.count
    }
    }

    extension YourOpinionViewController : UIPickerViewDelegate
    {
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
    return self.pickerData[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
    self.currentTextField?.text = pickerData[row]

    self.currentTextField?.endEditing(true)
    }
    }

    extension YourOpinionViewController : UITextFieldDelegate
    {
    func textFieldDidBeginEditing(_ textField: UITextField)
    {
    self.currentTextField = textField
    self.pickerView.selectRow(pickerData.index(of: self.currentTextField?.text ?? "")!, inComponent: 0, animated: false)
    }

    func textFieldDidEndEditing(_ textField: UITextField)
    {
    self.currentTextField = nil
    }
    }


    RESOLU


Connectez-vous ou Inscrivez-vous pour répondre.