Une petite question

Bonjour tous le monde,


 


Je le dit et le dirai Merci, Merci pour votre aide et vos reflections.


 


Voilà  


 


Je remplie un formulaire x qui est juste après un UIViewController et quant je revient sur ce UIViewController, il ne charge pas les donnée de ce formulaire, je dois revenir au debut de mon application pour rechercher le tous. existe t-il une fonctions pour cela ? Ou juste le code qui me faut ?


 


Merci a vous,


Réponses

  • JérémyJérémy Membre
    février 2017 modifié #2

    Salut !


     


    Pour effectuer un traitement à  chaque fois que tu vas sur une UIViewController, tu as la méthode viewWillAppear qui est appelée.


     


    Par contre, ce que je n'ai pas compris, c'est lorsque tu es sur ton formulaire X tu remplis les champs et ton UIViewController doit prendre en compte les datas de ton formulaire X (pour les afficher par exemple) ? Si c'est le cas, tu peux t'en sortir avec un prepareForSegue. Mais il faudrait plus d'indication sur l'enchainement des écrans. :)


  • LexxisLexxis Membre
    février 2017 modifié #3

    C'est surement un simple problème de mise à  jour de ta vue.


    Pas mal de solutions existe:


    - viewWillAppear viewDidAppear dans lequel tu peux mettre à  jours la vue


    - Un protocole spécifique permettant d'indiquer à  l'appelant que le formulaire à  été validé et qu'il faut mettre à  jour la vue


    - Un block appelé à  la validation du formulaire dans lequel tu peux aussi mettre à  jours la vue


    - Une notification envoyé par le formulaire pour signaler sa fermeture

  • Joanna CarterJoanna Carter Membre, Modérateur

    Les données pour le formulaire se trouvent où exactement ?


     


    Tu les sauvegardes quelque part dehors le formulaire ?


  • J'ai essays viewWillAppear mais cela ne donne rien,


    J'ai l'impression que la fonction ne charge pas quant je revient.

  • Tu ne peux pas nous montrer un peu de ton code, parce que là , c'est plutôt flou ..

  • easydeasyd Membre
    février 2017 modifié #7

    Pour le formulaire dans mon serveur dans ma BDD que je sauvegarde mon formulaire.


     


    Tous fonctionne bien, c'est juste une question de recharger des donnée a chaque fois que je me trouve dans le storyboard.


    Il faut que j'aille au 1er storyboard pour tous recharger.


     


    OK je vous donne cela 



    import UIKit
    import MapKit
    import CoreLocation
    import SceneKit
    import AlamofireImage
    import Alamofire
    import CoreData

    @available(iOS 10.0, *)
    class InfViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {


    @IBOutlet weak var titre: UINavigationItem!
    @IBOutlet weak var ui_a: UILabel!
    @IBOutlet weak var ui_ville: UILabel!
    @IBOutlet weak var ui_totalLabel: UILabel!
    var ui_id: UILabel!
    @IBOutlet weak var map: MKMapView!
    @IBOutlet weak var images: UIImageView!
    @IBOutlet weak var image: UIImageView!

    var TabInfos1 = String()
    var tabInfos2 = String()
    var _person:[String:AnyObject]?

    var refreshControl: UIRefreshControl!

    override func viewDidLoad() {
    super.viewDidLoad()

    if !(_person?["logo"] is NSNull){
    Alamofire.request(_person?["logo"] as! String)
    .responseImage { response in
    if let image = response.result.value {
    self.images.image = image
    }
    }
    }

    if !(_person?["img"] is NSNull){
    Alamofire.request(_person?["img"] as! String)
    .responseImage { response in

    if let image1 = response.result.value {
    self.images.image = image1
    }
    }
    }

    map.mapType = MKMapType.standard

    let longitudeString = _person?["Longitude_a"] as! String?
    let latitudeString = _person?["Latitude_a"] as! String?

    let doubleLat = Double(latitudeString!)
    let doubleLon = Double(longitudeString!)

    if doubleLat == nil && doubleLon == nil {

    }else{
    let location:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: (doubleLat)!, longitude: (doubleLon)!)

    let span = MKCoordinateSpanMake(0.01, 0.01)
    let region = MKCoordinateRegion(center: location, span: span)
    map.setRegion(region, animated: true)

    let annotation = MKPointAnnotation()
    annotation.coordinate = location
    annotation.title = _person?["nom"] as! String?
    annotation.subtitle = _person?["total"] as! String?
    map.addAnnotation(annotation)

    }

    insertData()
    }

    override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)

    if NetworkViewController.isConnectedToNetwork() == true
    {
    }
    else
    {

    let alert = UIAlertController(title: "No Internet Connection", message: "Make sure your device is connected to the internet.", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
    self.present(alert, animated: true, completion: nil)

    }
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

    override func viewWillAppear(_ animated: Bool) {
    if let person = _person {
    self.navigationItem.title = person["nom"] as? String
    ui_a.text = person["nom_site "] as? String
    ui_ville.text = person["ville"] as? String
    ui_totalLabel.text = person["total"] as? String
    TabInfos1 = (person["id_site"] as? String)!

    }

    }

    func insertData(){

    tabInfos2 = (_person?["id_site"] as? String)!
    let user = A(context: context)
    user.id = tabInfos2

    appDelegate.saveContext()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    if segue.identifier == "showDetail2",
    let personViewController = segue.destination as? YourViewController
    {
    personViewController.tabInfos = TabInfos1
    print("TabInfosddd", personViewController.tabInfos)
    }

    }
    }

    Voilà ,

  • Joanna CarterJoanna Carter Membre, Modérateur

    Bah non. D'abord tu nous montres du code.


  • Et bien c'est celui là  mon code.


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #10

    Quelques commentaires dans le code :


     





    class InfViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {


    @IBOutlet weak var titre: UINavigationItem! // pourquoi ? C'est déjà  dans UIViewController
    @IBOutlet weak var ui_a: UILabel!
    @IBOutlet weak var ui_ville: UILabel!
    @IBOutlet weak var ui_totalLabel: UILabel!
    var ui_id: UILabel! // pourquoi pas en @IBOutlet ? et pourquoi utiliser le '!'
    @IBOutlet weak var map: MKMapView!
    @IBOutlet weak var images: UIImageView!
    @IBOutlet weak var image: UIImageView!

    var TabInfos1 = String()
    var tabInfos2 = String()
    var _person:[String:AnyObject]? // ne jamais utiliser _ pour le noms des vars

    var refreshControl: UIRefreshControl!

    override func viewDidLoad() {
    super.viewDidLoad()

    ...
    }

    override func didReceiveMemoryWarning() { // si tu ne faire rien d'autre là  dedans, supprimes cette méthode
    super.didReceiveMemoryWarning()
    }

    ...

    }

    ...
    }



     


    viewDidLoad est appelé quand le viewController est chargé du storyboard. Si tu a déjà  affecté la var 'person', tout va bien mais, si tu recharges le viewController après, ça fait un nouveau viewController dont il faut affecter 'person' encore une fois et, dans le didSet, mettre à  jour l'UI.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Et, nom d'un chien ! Pour ta santé mentale, arrêtes-toi de saupoudrer ton code avec les ? et, surtout les ! !!!



    override func viewDidLoad()
    {
    super.viewDidLoad()

    guard let person = self.person else
    {
    return
    }

    if let logo = person["logo"] as? String
    {
    Alamofire.request(logo)
    .responseImage
    {
    response in

    if let image = response.result.value
    {
    self.images.image = image
    }
    }
    }

    if let img = person["img"] as? String
    {
    Alamofire.request(img)
    .responseImage
    {
    response in

    if let image1 = response.result.value
    {
    self.images.image = image1
    }
    }

    map.mapType = MKMapType.standard

    guard let longitudeString = person["Longitude_a"] as? String,
    let doubleLon = Double(longitudeString),
    let latitudeString = person["Latitude_a"] as? String,
    let doubleLat = Double(latitudeString) else
    {
    return
    }

    let location:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: doubleLat, longitude: doubleLon)

    let span = MKCoordinateSpanMake(0.01, 0.01)

    let region = MKCoordinateRegion(center: location, span: span)

    map.setRegion(region, animated: true)

    let annotation = MKPointAnnotation()

    annotation.coordinate = location

    annotation.title = person["nom"] as? String

    annotation.subtitle = person["total"] as? String

    map.addAnnotation(annotation)
    }

    // insertData()

    }
  • ..et pour les tests qui ne font rien.. fait plutôt le test inverse ^^



    if NetworkViewController.isConnectedToNetwork() == true{

    }
    else{
    // code
    }

    **************

    if NetworkViewController.isConnectedToNetwork() == false{
    // code
    }


  •  


    ..et pour les tests qui ne font rien.. fait plutôt le test inverse ^^



    if NetworkViewController.isConnectedToNetwork() == true{

    }
    else{
    // code
    }

    **************

    if NetworkViewController.isConnectedToNetwork() == false{
    // code
    }



     


    Ou



    if !NetworkViewController.isConnectedToNetwork() {
    // code
    }
  • Ou



    if NetworkViewController.isConnectedToNetwork() != true {
    // code
    }

    xd 


  • Joanna CarterJoanna Carter Membre, Modérateur
    Ah, la bataille de négation :)
  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #16

    Quand même, dans ce cas là   :



    override func viewDidAppear(_ animated: Bool)
    {
    super.viewDidAppear(animated)

    guard NetworkViewController.isConnectedToNetwork() == false else
    {
    return
    }

    let alert = UIAlertController(title: "No Internet Connection", message: "Make sure your device is connected to the internet.", preferredStyle: .alert)

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

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

  • OK merci pour tous,


     


    Je vais modifier mon code.


     


    Merci a vous,


  • Bonjour tous le monde,


     


    J'ai toujours le même  problème ça ne charge pas les informations quant je fait un retour en arrière, il faut que je recharge (cell) mon appli pour voir les nouvelles informations s'affiche.


     


    merci,


  • Joanna CarterJoanna Carter Membre, Modérateur

    Comment tu retrouves et mets les informations dans le viewController la première fois ?






  • Je passe par un UITableViewCell, je fais mon choix sur la liste de produits, puis je passe sur UIViewController détails de m'ont produit, je peux ajouter des infos je clique et passe dans un UIViewController je remplis ce que je veux et valide cela s'enregistre dans ma BDD et quand je retourne à  mon étape détails produit, je devrais voir ce que j'ai rempli mais là  rien (pas de rafraichissement du storyboard) 



    Je suis obligé d'aller dans mon UITableViewCell et cliquer sur mon menu qui s'ouvre sur le côté (comme sur Facebook appli IOS) et de clique sur mes produits cela recharge tous et là  je trouve tout.


     


    voilà ,

  • Tu peux essayer d'ajouter un reloadData() de la tableView dans viewWillAppear. C'est assez brutal mais cela te permettra de voir si c'est un problème de rafraà®chissement de cellule.


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