web-dev-qa-db-fra.com

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 j'aimerais personnaliser le prototype de cellule. Dans le prototype de cellule, j'ai ajouté plusieurs étiquettes à 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, celui-ci affiche ma classe implémentant UITableViewController (AreasTableViewController) et non
ma classe "AreaListCell".

La conséquence est que je peux créer un point de vente (à l'aide de la combinaison de touches Ctrl + Drag de l'étiquette du prototype de cellule) vers la classe AreasTableViewController, mais pas vers la classe AreaListCell!

Merci de votre aide! 

36
sebastien

UPDATE: À partir de Xcode 4.6 (éventuellement plus tôt), vous pouvez maintenant créer des points de vente en faisant glisser vos contrôles! - 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 l'avoir signalé.

Vous ne pouvez pas connecter automatiquement la prise et la créer en les faisant glisser dans le bloc de code de l'éditeur assistant, ce qui est médiocre, mais vous pouvez créer les prises manuellement et les connecter ensuite. 

Dans votre interface de sous-classe de cellule:

@interface CustomCell : UITableViewCell

@property (nonatomic) IBOutlet UILabel* customLabel;

@end

Synthétisez normalement dans la mise en œuvre. 

Dans le storyboard, sélectionnez la cellule et accédez à l'inspecteur de connexions, vous verrez le nouveau point de vente. Faites glisser de là vers l'élément pertinent de votre prototype: 

enter image description here

Vous pouvez maintenant y accéder en tant que cell.customLabel dans votre méthode cellForRowAtIndexPath:.

128
jrturton

Oui, vous ne pouvez pas connecter des vues situées à l'intérieur d'une cellule prototype personnalisée à l'aide de la méthode ctrl + glisser. Utilisez plutôt la propriété tag de la vue, puis, lorsque vous créez la cellule, extrayez les étiquettes à l'aide de leurs balises.

Ici:

//Let's assume you have 3 labels.  One for a name, One for a count, One for a detail
//In your storyboard give the name label tag=1, count tag=2, and detail 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 = @"name";
    countLabel.text = @"count";
    detailLabel.text = @"details";

    return theCell;
}

Vous pouvez également définir les étiquettes en tant que propriétés dans votre code de cellule personnalisé, puis, lorsque la cellule est initialisée, utilisez l'appel viewWithTag pour affecter les propriétés d'étiquette aux étiquettes que vous avez créées sur vos storyboards.

Il m'a fallu quelques jours pour comprendre que je ne pouvais pas ctrl + glisser depuis une cellule personnalisée pour créer un IBOutlet.

Bonne chance!

EDIT: Vous POUVEZ créer des IBOutlets pour vos étiquettes dans une cellule personnalisée et créer les liens par programme, mais pas par la méthode ctrl + glisser.

EDIT 2: Je me suis totalement trompé, vous pouvez ctrl + glisser. Voir la deuxième réponse à cette question. C'est délicat, mais ça fonctionne assez bien.

21
Justin Paulson

Swift 3

// nous l'utilisons si vos images sont sur le serveur.

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

// vous pouvez définir l'image à partir de votre Xcode.

  1. L'URL des images se trouve dans un tableau. Name = thumbnail i.e self.thumbnail [indexPath.row] 
  2. sur UITableviewCell mettre un imageView sur la cellule
  3. sélectionnez UIimageView et affectez-lui une balise du storyboard.

    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
    
0
Ameer Chand