36 votes

Connecter la sortie d'un prototype de cellule dans un storyboard

Je suis un débutant avec le Storyboard et j'ai donc quelques difficultés...

J'ai créé un TableViewController et je voudrais personnaliser le Prototype de Cellule. Dans le Prototype de Cellule, j'ai ajouté plusieurs étiquettes que je voudrais personnaliser avec ma propre classe qui hérite de UITableViewCell (AreaListCell). Dans le Storyboard, pour le Prototype de Cellule, j'ai configuré la Classe Personnalisée avec "AreaListCell" et son style est "Custom".

Dans le storyboard, lorsque je sélectionne le Prototype de Cellule puis l'assistant, l'assistant affiche ma classe qui implémente le UITableViewController (AreasTableViewController) et non ma classe "AreaListCell".

La conséquence est que je peux créer une prise (en utilisant Ctrl + Glisser depuis l'étiquette du Prototype de Cellule) vers la classe AreasTableViewController mais pas vers la classe AreaListCell ! Avez-vous une idée de comment connecter le Prototype de Cellule avec ma classe AreaListCell ?

Merci pour votre aide !

128voto

jrturton Points 64875

MISE À JOUR : À partir de Xcode 4.6 (peut-être plus tôt), vous pouvez désormais créer des outlets en faisant glisser en maintenant la touche de contrôle enfoncée ! - Cela doit être fait dans une section d'interface ou une extension de classe (l'extension de classe n'existe pas par défaut pour les nouvelles sous-classes de cellules. Merci à Steve Haley pour avoir souligné cela.

Vous ne pouvez pas obtenir l'outlet automatiquement connecté et créé en le faisant glisser dans le bloc de code de l'éditeur assistant, ce qui est dommage, mais vous pouvez créer les outlets manuellement et les connecter ensuite.

Dans l'interface de votre sous-classe de cellules :

@interface CustomCell : UITableViewCell

@property (nonatomic) IBOutlet UILabel* customLabel;

@end

Synthétisez comme d'habitude dans l'implémentation.

Dans le storyboard, sélectionnez la cellule et allez dans l'inspecteur de connexions, vous verrez le nouvel outlet. Faites glisser à partir de là jusqu'à l'élément pertinent dans votre prototype :

entrez la description de l'image ici

Cela peut maintenant être accédé en tant que cell.customLabel dans votre méthode cellForRowAtIndexPath:.

21voto

Justin Paulson Points 3013

Oui, vous ne pouvez pas connecter des vues qui se trouvent à l'intérieur d'une cellule de prototype personnalisée en utilisant la méthode ctrl+drag. Au lieu de cela, utilisez la propriété tag de la vue, puis lorsque vous construisez la cellule, extrayez les libellés en utilisant leurs tags.

Voici :

// Supposons que vous avez 3 libellés. Un pour un nom, un pour un compteur, un pour un détail
// Dans votre storyboard, attribuez au libellé de nom le tag=1, au compteur le tag=2, et au détail le tag=3

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomTableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:@"Prototype Cell"];

    UILabel *nameLabel = (UILabel *)[theCell viewWithTag:1];
    UILabel *countLabel = (UILabel *)[theCell viewWithTag:2];
    UILabel *detailLabel = (UILabel *)[theCell viewWithTag:3];

    nameLabel.text = @"nom";
    countLabel.text = "compter";
    detailLabel.text = "détails";

    return theCell;
}

Vous pouvez également définir les libellés comme propriétés dans le code de votre cellule personnalisée, puis lorsque la cellule est initialisée, utilisez l'appel à viewWithTag pour affecter les propriétés de libellé aux libellés que vous avez créés dans vos storyboards.

Il m'a fallu quelques jours pour réaliser que je ne pouvais pas faire un ctrl+drag de l'intérieur d'une cellule personnalisée pour créer une IBOutlet.

Bonne chance !

EDIT : Vous POUVEZ créer des IBOutlets pour vos libellés à l'intérieur d'une cellule personnalisée et créer les liens de manière programmatique, juste pas via la méthode ctrl+drag.

EDIT 2 : J'avais complètement tort, vous pouvez faire un ctrl+drag. Voir la deuxième réponse à cette question. C'est délicat, mais ça fonctionne assez bien.

0voto

Ameer Chand Points 51

Swift 3

// nous utilisons ceci si vos images sont sur le serveur.

// nous obtenons des images à partir d'une URL.

// vous pouvez définir une image depuis Xcode.

  1. L'URL des images se trouve dans un tableau nommé vignette, c'est-à-dire self.thumbnail[indexPath.row]
  2. sur la cellule de l'UITableviewCell mettre une imageView sur la cellule
  3. sélectionnez UIimageView lui attribuer une balise à partir de l'interface graphique.

    let pictureURL = URL(string: self.thumbnail[indexPath.row])!
    let pictureData = NSData(contentsOf: pictureURL as URL)
    let catPicture = UIImage(data: pictureData as! Data)
    var imageV = UIImageView()
    imageV = cell?.viewWithTag(1) as! UIImageView
    imageV.image = catPicture

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X