Les prises ne peuvent pas être connectées au contenu répété iOS

144

Je viens de créer une application et j'ai commencé à connecter @ IBOutlet au storyboard. Je connecte certains d'entre eux à des étiquettes dans une cellule prototype UITableViewCell avec un style de base. Lorsque je le connecte, j'obtiens cette erreur dans le Storyboard:

La sortie detailText entre TableViewController et UILabel n'est pas valide. Les prises ne peuvent pas être connectées à du contenu répétitif.

Est-ce que quelqu'un peut m'aider? Je l'ai configuré comme je le fais toujours avec succès, mais cette fois, cette erreur m'a jeté.

Tomblasta
la source
54
Vous ne pouvez pas connecter une étiquette dans une cellule prototype à un IBOutlet dans une sous-classe UIViewController - vous devez le connecter à un IBOutlet dans une sous-classe UITableviewCell.
Paulw11
OK merci! :) Alors juste pour que je comprenne: pouvez-vous expliquer pourquoi?
Tomblasta
3
Parce que vous pouvez avoir n'importe quel nombre de cellules et un seul contrôleur de vue - quelle étiquette de cellule doit donc être connectée aux contrôleurs de vue IBOutlet?
Paulw11
Ok, alors pourquoi ne pourriez-vous pas simplement utiliser le cellForRowAtIndexPath pour le texte de la cellule dans un seul contrôleur de vue? Merci!
Tomblasta
3
Parce que les prises sont liées à des objets (tels que des étiquettes) lorsque le contrôleur de vue est chargé - À ce stade, il n'y a pas de cellules, donc pas d'étiquette à lier, et s'il y avait des cellules, laquelle vouliez-vous lier
Paulw11

Réponses:

168

Créez une sous-classe de cellule de vue tableau et définissez-la comme classe du prototype. Ajoutez les prises à cette classe et connectez-les. Désormais, lorsque vous configurez la cellule, vous pouvez accéder aux prises.

Wain
la source
9
@Wain pourriez-vous s'il vous plaît ajouter plus d'informations sur l'accès à ces points de vente?
Juan Boero
1
Juan Pablo - Ce qu'il dit, c'est qu'il est normal d'utiliser une cellule de vue de tableau personnalisée. Vous ne pouvez pas définir la sortie pour une contrainte à l'intérieur de la vue où vous utilisez la cellule, mais vous devez le faire dans cellForRowAtIndexPath par exemple - customCell.constraint_row_width.constant = 25.0;
Stuart P.
70

Il existe deux types de cellules de vue de tableau qui vous sont fournies via le storyboard, ce sont des prototypes dynamiques et des cellules statiques.

entrez la description de l'image ici

1. Prototypes dynamiques

A partir du nom, ce type de cellule est généré dynamiquement. Ils sont contrôlés par votre code, pas par le storyboard. Avec l'aide du délégué de la vue tableau et de la source de données, vous pouvez spécifier le nombre de cellules, les hauteurs de cellules, le prototype de cellules par programme.

Lorsque vous faites glisser une cellule vers votre vue de tableau, vous déclarez un prototype de cellules. Vous pouvez ensuite créer n'importe quelle quantité de cellules sur la base de ce prototype et les ajouter à la vue de tableau via la cellForRowméthode, par programme. L'avantage est que vous n'avez besoin de définir qu'un seul prototype au lieu de créer chaque cellule avec toutes les vues ajoutées par vous-même (voir cellule statique).

Donc, dans ce cas, vous ne pouvez pas connecter les éléments d'interface utilisateur du prototype de cellule à votre contrôleur de vue. Vous n'aurez qu'un seul objet contrôleur de vue lancé, mais plusieurs objets de cellule peuvent être lancés et ajoutés à votre vue de table. Il est inutile de connecter le prototype de cellule au contrôleur de vue car vous ne pouvez pas contrôler plusieurs cellules avec une seule connexion de contrôleur de vue. Et vous obtiendrez une erreur si vous le faites.

entrez la description de l'image ici

Pour résoudre ce problème, vous devez connecter votre étiquette prototype à un UITableViewCellobjet. A UITableViewCellest également un prototype de cellules et vous pouvez initier autant d'objets de cellule que vous le souhaitez, chacun d'eux est ensuite connecté à une vue générée à partir de votre prototype de cellule de table de scénario.

entrez la description de l'image ici

Enfin, dans votre cellForRowméthode, créez la cellule personnalisée à partir de la UITableViewCellclasse et faites des choses amusantes avec l'étiquette

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. Cellules statiques

D'autre part, les cellules statiques sont en effet configurées via le storyboard. Vous devez faire glisser les éléments de l'interface utilisateur vers chaque cellule pour les créer. Vous contrôlerez le nombre de cellules, les hauteurs, etc. à partir du storyboard. Dans ce cas, vous verrez une vue de table qui est exactement la même que celle de votre téléphone par rapport à ce que vous avez créé à partir du storyboard. Les cellules statiques sont plus souvent utilisées pour la mise en page, que les cellules ne changent pas beaucoup.

Pour contrôler les éléments de l'interface utilisateur d'une cellule statique, vous devrez en effet les connecter directement à votre contrôleur de vue, et les paramétrer.

entrez la description de l'image ici

Fangming
la source
@FangmingNing dans mon code, je ne peux toujours pas changer l'étiquette de texte, j'ai connecté la classe à la cellule, appelée cellule correcte avec l'identifiant, mais toujours pas en train de changer
jorge saraiva
@jorgesaraiva Discutons de cela dans la salle de chat chat.stackoverflow.com/rooms/159396/discuss
Fangming
Je manquais comme! YourCell . +100
Daniel Springer
Toujours bon d'avoir un petit rappel après avoir travaillé sur un projet en juste code pendant 6 mois.
ttorbik
Merci, mon problème est que je le connecte au ViewController plutôt qu'à la cellule.
Stella le
23

Si vous utilisez une vue de tableau pour afficher les paramètres et d'autres options (comme le fait l'application Paramètres intégrée), vous pouvez définir le contenu de votre vue de tableau sur des cellules statiques sous l'inspecteur d'attributs . Pour ce faire, vous devez également incorporer votre vue Table dans une instance UITableViewController.

Justin Domnitz
la source
C'est de manière plus simple et plus rapide et devrait être la réponse acceptée à mon humble avis
Jaime Agudo
5

Ou vous n'avez pas besoin d'utiliser IBOutlet pour faire référence à l'objet dans la vue. Vous pouvez attribuer au Label dans la tableViewCell une valeur de Tag, par exemple définir le Tag sur 123 (cela peut être fait par l'inspecteur d'attributs). Ensuite, vous pouvez accéder à l'étiquette en

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}
SLN
la source
très facile et simple! +100
Julian Silvestri
1

Avec moi, j'ai un UIViewcontroller, et j'y ai un tableau avec une cellule personnalisée. Je mappe ma sortie d'UILabel sur UItableviewcellle UIViewControllerpuis j'ai l'erreur.

Lee
la source
créer une classe de cellule personnalisée et instancier iboutlet dans votre cette classe personnalisée
Shauket Sheikh
0

Comme la plupart des gens l'ont souligné, le sous - classementUITableViewCell résout ce problème. Mais la raison pour laquelle cela n'est pas autorisé, car la cellule prototype ( UITableViewCell ) est définie par Apple et vous ne pouvez pas y ajouter vos propres prises.

Nikhil Muskur
la source
0

Parfois, Xcode ne pouvait pas contrôler correctement la connexion de la sortie de la cellule.

D'une manière ou d'une autre, l'étiquette / le bouton de ma cellule actuelle a connecté une autre cellule, je les supprime simplement et l'erreur disparaît.

Shourob Datta
la source
-1

Cliquez sur le simulateur, accédez à la fenêtre et activez les cadres de l'appareil

automatisation eng
la source