UIcollectionView et ajout items

heliohelio Membre

Bonjour à  tous,


Sur la page d'accueil d'une application que je réalise, je souhaiterais avoir une Collection View avec seulement 3 cellules : 


- Parcourir 


- Recherche


- Profil


comment mettre en place cela avec le storyboard ?


Lorsque je sélectionne 3 items dans Collection View, elles apparaissent bien mais en lançant l'application rien ne s'affiche.


 


J'ai bien réussi à  faire ce que je veux avec le code suivant, mais le problème c'est que n'importe quelle cellule où l'on clique, je pointe vers un même écran



override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//#warning Incomplete method implementation -- Return the number of sections
return 1
}

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
//#warning Incomplete method implementation -- Return the number of items in the section
return 3
}

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CollectionViewCell
cell.labelCollectionCell.text = self.titles[indexPath.row]
let id = indexPath.row + 1
let imgName = "img\(id).png"
cell.imgCollectionCell.image = UIImage(named: imgName)

return cell
}

D'avance merci de votre aide.


Réponses

  • LarmeLarme Membre

    Merci de passer par la case présentation.


     


    Comment est-défini le changement de ViewController?


    Via Storyboard? Via Code? Que dit collectionView:didSelectItemAtIndexPath:?


  • heliohelio Membre

    Bonsoir,


    Mon problème est réglé, merci


    voici le code :



    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    println(indexPath.row)
    if (indexPath.row == 0) {
    let vc : AnyObject! = self.storyboard?.instantiateViewControllerWithIdentifier("ThemeViewController")
    self.showViewController(vc as! UIViewController, sender: vc)
    }

  • Salut je débute ne swift mais l'utilisation d'Anyobject ! et du as! me semble étrange bien que je ne maitrise pas encore tout cela je pense qu'il vaudrait mieux utiliser un if let vc = ....

  • AliGatorAliGator Membre, Modérateur
    Sur le principe, je plussoie la remarque de iLandes.

    - AnyObject est à  éviter en Swift, il existe mais + pour être interprétable avec le type "id" d'Objective-C. Swift étant un langage + fortement typé que Objective-C, en Swift on préfère éviter "AnyObject" et spécifier à  la place les vrais types.
    - "as!" est à  éviter, sauf si on sait de source sûre que le type ne peut vraiment, vraiment pas être autre chose, parce qu'on a fait un test préalable avec un "if" avant par exemple, ou parce que ça vient d'une API Objective-C qui retourne id/AnyObject mais qu'en fait on sait très bien que c'est toujours forcément une classe spécifique. En effet, avec "as!", si le cast n'est pas possible, le programme va tout simplement planter (avec une exception).



    Dans l'exemple du code de helio, le "vc as! UIViewController" (avec un "as!" plutôt qu'un "as?") ne me choque pas car vc vient du retour de la méthode "instantiateViewControllerWithIdentifier", donc ça tombe dans le cas que je viens d'expliquer, c'est une API Objective-C qui, en Swift, indique que la méthode retourne "AnyObject!", donc un type un peu trop générique, à  cause du bridging ObjC/Swift (et du fait que Apple ne l'a pas encore annotée pour indiquer le vrai type de retour plus spécifique). Mais en pratique on sait pertinemment que cette méthode retourne toujours un objet de type UIViewController, donc le cast avec "as!" est acceptable.

    Ceci dit, en vrai l'instanciation peut rater (une fois qu'Apple aura correctement annoté cette méthode, elle devrait indiquer qu'en vrai au lieu de remonter un "AnyObject!" elle retourne un "UIViewController?") si par exemple tu n'as pas le bon identifier, donc c'est certainement un Optional pour pouvoir retourner "nil" quand ça foire.
    Et de toute façon, toute l'expression est forcément un Optional, à  cause de l'usage de "l'Optional Chaining" dans l'expression (le fait que "storyboard" soit un optional, l'expression "storyboard?instanciateViewControllerWithIdentifier(...)" est elle-même un optional car si jamais "storyboard" est nil, la méthode ne sera du coup pas appelée (optional chaining) et l'expression retournera nil.

    Enfin, l'utilisation de "AnyObject" dans la ligne d'avant, je ne le vois pas justifié pour moi.

    Ainsi, j'écrirais plutôt ceci :

    if let vc = self.storyboard?.instantiateViewControllerWithIdentifier("ThemeViewController") as! UIViewController? {
    // - "as!" car on sait que ça va forcément retourner un "UIViewController?",
    // (le type "AnyObject!" qu'on voit dans l'API qui est trop générique c'est juste parce qu'Apple
    // n'a pas encore tout annoté pour Swift, mais on peut faire un cast forcé car si vraiment c'est pas
    // un UIViewController ou nil mais un truc d'une autre classe, c'est qu'on a un gros souci et c'est
    // pas illogique que ça plante dans ce cas très improbale)
    // - "UIViewController?" car ça peut retourner un UIViewController... ou nil
    // si storyboard est nil ou si la méthode renvoie nil car n'a pas trouvé de VC avec cet identifier
    // En tout cas c'est un Optional surtout parce que l'expression est un Optional Chaining
    // c'est à  dire parce qu'au moins un des éléments dans l'expression est Optional donc peut être nil.
    }
  • heliohelio Membre

    Merci pour les remarques et explications.


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