Swift, plist, Dictionnary et UITableView

2»

Réponses

  • Bon je deviens dingue, j'ai refait un projet tout propre avec ton code.


    Et même problème j'obtiens un nil sur le clubName


     


    Alors que ton projet fonctionne parfaitement chez moi.


     


    Ca me rend fou ! B)


  • Truc de malade :


     


    • Si je fait un Product -> Run ca ne fonctionne pas !
    • Si je fait un Product -> Test puis qu'après je clique sur l'icône de l'app dans l'émulateur ça fonctionne.
  • Joanna CarterJoanna Carter Membre, Modérateur

    Ouah ! C'est vachement frustrant. Je viens de télécharger ton projet. Je l'essaierai ici.


  • Paisible.frPaisible.fr Membre
    août 2014 modifié #35

    Rahhh !!!!


     


    Je viens d'effacer toutes mes betas de Xcode 6, re-téléchargé la Beta6 sur le devCenter.


    J'ai fait un "Reset content and settings" de l'émulateur. Et j'ai le même problème !


     


    Si je fais un Run : ca ne marche pas. Si juste après je fait "Home" et que je relance l'app ça ne marche pas non plus.


     


    Par contre avec un Test. Puis un clique sur l'App ca fonctionne....


  • Joanna CarterJoanna Carter Membre, Modérateur

    Je viens de simplifier ton code (trop de ? et !)



    override func viewDidLoad()
    {
    super.viewDidLoad()

    // Get the clubs list
    let path = NSBundle.mainBundle().pathForResource("Clubs", ofType: "plist")

    clubsList = NSArray(contentsOfFile:path)
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView!) -> Int
    {
    return 1
    }

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
    {
    return clubsList.count
    }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
    {
    // Get a Cell
    let cell = tableView.dequeueReusableCellWithIdentifier("clubCell", forIndexPath: indexPath) as UITableViewCell

    // Get the informations of the 1st club

    let index = indexPath.row;

    let currentClub: AnyObject = clubsList[index]

    // Get the Name of the clubs
    let clubName = currentClub["clubName"] as String

    println(clubName)

    // Convert
    // Set the Cell
    cell.textLabel.text = clubName

    cell.detailTextLabel.text = "test"

    // return the cell
    return cell
    }

    ça marche chez moi. Tu veux l'essayer ?


  • J'ai supprimé le dossier :



    /Users/YOURUSERNAME/Library/Developer/Xcode/

     Et ça fonctionne !!!  :p


     


    Bon du coup j'ai perdu 3 jours. 


    Et en plus je pense que ça m'a embrouillé dans mon apprentissage de Swift.


     


    Je crois que je vais laisser passer un peu de temps pour m'y remettre car ça à  saper ma motivation.


     


    Un énorme merci à  vous tous pour votre aide ! 


  • Joanna CarterJoanna Carter Membre, Modérateur

    Et, si tu veux éviter d'utiliser AnyObject pour les items d'un Array :



    let currentClub = clubsList[index] as Dictionary<String, String>
  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #39


    J'ai supprimé le dossier :



    /Users/YOURUSERNAME/Library/Developer/Xcode/

     Et ça fonctionne !!!  :p


     


    Bon du coup j'ai perdu 3 jours. 


    Et en plus je pense que ça m'a embrouillé dans mon apprentissage de Swift.


     


    Je crois que je vais laisser passer un peu de temps pour m'y remettre car ça à  saper ma motivation.


     


    Un énorme merci à  vous tous pour votre aide ! 




     


    Yeeesssss !!!!


     


    Mais, je remarque que tu utilise une syntaxe Swift qui est déjà  "démodée" ; c'est la problème avec les betas  >:(




  • Je viens de simplifier ton code (trop de ? et !)



    override func viewDidLoad()
    {
    super.viewDidLoad()

    // Get the clubs list
    let path = NSBundle.mainBundle().pathForResource("Clubs", ofType: "plist")

    clubsList = NSArray(contentsOfFile:path)
    }

    // MARK: - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView!) -> Int
    {
    return 1
    }

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
    {
    return clubsList.count
    }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
    {
    // Get a Cell
    let cell = tableView.dequeueReusableCellWithIdentifier("clubCell", forIndexPath: indexPath) as UITableViewCell

    // Get the informations of the 1st club

    let index = indexPath.row;

    let currentClub: AnyObject = clubsList[index]

    // Get the Name of the clubs
    let clubName = currentClub["clubName"] as String

    println(clubName)

    // Convert
    // Set the Cell
    cell.textLabel.text = clubName

    cell.detailTextLabel.text = "test"

    // return the cell
    return cell
    }

    ça marche chez moi. Tu veux l'essayer ?




    Merci Joanna, mais je ne pense pas que c'était tellement un problème de code à  la base (même si j'avais du faire quelques erreurs de débutant) mais plutôt un problème d'environnement/comportement de Xcode. Je pense l'avoir résolu (cf. post ci dessus)


    Je regarderais tout de même ton code, ça peut être intéressant d'avoir ta vision des choses. Par contre je suis pas certain qu'il soit opportun de  retirer tout les ? et ! dans du code Swift. Mais bon je suis débutant en la matière.


     


    Merci à  toi.

  • Je vais laisser reposer tout ça pour retrouver les idées claires et m'y remettre plus tard car là  j'ai perdu ma motivation et ma lucidité avec ce comportement étrange de Xcode 6 beta.


  • Joanna CarterJoanna Carter Membre, Modérateur


    Merci Joanna, mais je ne pense pas que c'était tellement un problème de code à  la base (même si j'avais du faire quelques erreurs de débutant) mais plutôt un problème d'environnement/comportement de Xcode. Je pense l'avoir résolu (cf. post ci dessus)




     


    Bien entendu. J'ai répondu afin que tu (et les autres qui suivent le sujet) puisses mieux comprendre ce qui arrive avec la syntaxe de Swift


     




    Je regarderais tout de même ton code, ça peut être intéressant d'avoir ta vision des choses. Par contre je suis pas certain qu'il soit opportun de  retirer tout les ? et ! dans du code Swift. Mais bon je suis débutant en la matière.




     


    Avec Swift, nous sommes tous les débutants  :o


     


    Les APIs de Cocoa ont changés, peut-être depuis tu as commencé ton projet. Surtout, beaucoup de fonctions renvoient les "implicitly unwrapped optionals", donc, je crois, si on n'est pas sûr si la valeur renvoyé soit nil ou non, on peut le tester après que l'on a assigné.


     


    Mais, actuellement tous est trop fluide, du coup on ne peut pas être certaine  ::)

  • Joanna CarterJoanna Carter Membre, Modérateur

    Je "joue" avec le code de Paisible et je me demandais si ce ci-dessous intéresserait n'importe qui ?



    class ClubsTableViewController: UITableViewController
    {
    // instancier clubList sur premier apel

    lazy var clubsList: Array<Dictionary<String, String>> =
    {
    let url = NSBundle.mainBundle().URLForResource("Clubs", withExtension:"plist")

    // en cas d'un URL inexistant, renvoyer un Array vide

    if url == nil
    {
    return Array<Dictionary<String, String>>()
    }

    // renvoyer contenu du plist

    return NSArray(contentsOfURL:url) as Array<Dictionary<String, String>>
    }()

    // MARK: - Table view data source

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int
    {
    // clubsList est garanti de n'être jamais nil

    return clubsList.count
    }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!
    {
    let cell = tableView.dequeueReusableCellWithIdentifier("clubCell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel.text = clubsList[indexPath.row]["clubName"];

    cell.detailTextLabel.text = "test"

    return cell
    }
    }
  • Merci Joanna, c'est toujours intéressant de lire le code des autres.


    Je ne connait pas le "lazy", je vais me documenter.


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