Plusieurs Picker view swift 3
easyd
Membre
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,
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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).
Merci encore de ton aide cela ma aider a avancer vers une solution, mais je bloque encore.
Voilà mon code :
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,
- 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.
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:
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.
Combien de lignes dans la picker view ? Réponse: 5 (une pour chaque nombre d'étoiles) soit pickerData.count
Quel est le texte affiché pour cette ligne ?
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.
Bonjour,
Je demande de l'aide je n'y arrive pas ça sauvegarde pas a chaque changement de ligne.
Voilà mon code changer :
Merci a vous,
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.
Je vient de faire ces modifications :
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,
Régales-toi
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 :
Voilà ,
Super je pense que j'ai trouver merci encore,
Je placerai le code est le cheminement pour d'autre que moi.
Super forum,
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
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 :
RESOLU