Personnalisé UITableViewCell de plume en Swift
Je suis en train de créer une table personnalisée vue de cellules à partir d'une plume. Je fais référence à cet article ici. Je suis confronté à deux problèmes.
J'ai créé un .xib fichier avec un UITableViewCell objet glissé sur elle. J'ai créé une sous-classe de UITableViewCell
et la définir comme la cellule de la classe et Cellule comme le réutilisables identificateur.
import UIKit
class CustomOneCell: UITableViewCell {
@IBOutlet weak var middleLabel: UILabel!
@IBOutlet weak var leftLabel: UILabel!
@IBOutlet weak var rightLabel: UILabel!
required init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
override init(style: UITableViewCellStyle, reuseIdentifier: String!) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
override func awakeFromNib() {
super.awakeFromNib()
//Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
//Configure the view for the selected state
}
}
Dans le UITableViewController j'ai ce code,
import UIKit
class ViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {
var items = ["Item 1", "Item2", "Item3", "Item4"]
override func viewDidLoad() {
super.viewDidLoad()
}
//MARK: - UITableViewDataSource
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
let identifier = "Cell"
var cell: CustomOneCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
if cell == nil {
tableView.registerNib(UINib(nibName: "CustomCellOne", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? CustomOneCell
}
return cell
}
}
Ce code est conforme à aucune erreur, mais quand je le lance dans le simulateur, il ressemble à ceci.
Dans le UITableViewController dans la table de montage, je n'ai rien fait pour la cellule. Vide identifiant et pas de sous-classe. J'ai essayé d'ajouter le Cellule identifiant pour le prototype de la cellule et il a couru de nouveau, mais j'obtiens le même résultat.
Une autre erreur que j'ai rencontré est, quand j'ai essayé de mettre en œuvre la méthode suivante dans la UITableViewController.
override func tableView(tableView: UITableView!, willDisplayCell cell: CustomOneCell!, forRowAtIndexPath indexPath: NSIndexPath!) {
cell.middleLabel.text = items[indexPath.row]
cell.leftLabel.text = items[indexPath.row]
cell.rightLabel.text = items[indexPath.row]
}
Comme indiqué dans l'article, j'ai mentionné, j'ai changé le cell
paramètre de forme de type UITableViewCell
à CustomOneCell
qui est mon sous-classe de UITableViewCell. Mais j'obtiens l'erreur suivante,
Méthode de remplacement avec le sélecteur 'tableView:willDisplayCell:forRowAtIndexPath:' a de type incompatible '(UITableView!, CustomOneCell!, NSIndexPath!) -> ()'
Quelqu'un a une idée de comment résoudre ces erreurs? Ces semblait bien fonctionner en Objective-C.
Merci.
EDIT: je viens de remarquer que si je change le simulateur de l'orientation paysage et de le rallumer pour le portrait, les cellules apparaissent! Je ne pouvais toujours pas à comprendre ce qu'il se passe. J'ai téléchargé un projet Xcode ici montrant le problème si vous avez le temps pour un coup d'oeil.
Vous devez vous connecter pour publier un commentaire.
Vous devriez essayer le code suivant pour votre projet:
(la syntaxe pour Swift 3+)
CustomOneCell.swift
TableViewController.swift
L'image ci-dessous montre un ensemble de contraintes de travail avec le code fourni sans les contraintes de l'ambiguïté du message à partir de Xcode.
"H:|-(10)-[leftLabel(60)]-(10)-[middleLabel(60)]-(10)-[rightLabel(60)]-(>=10)-|"
,"V:|-(10)-[leftLabel]-(10)-|"
,"V:|-(10)-[middleLabel]-(10)-|"
,"V:|-(10)-[rightLabel]-(10)-|"
.Voici mon approche à l'aide de Swift 2 et Xcode 7.3. Cet exemple permet d'utiliser un seul ViewController de charger deux .xib fichiers, l'un pour une UITableView et un pour le UITableCellView.
Pour cet exemple, vous pouvez déposer une UITableView à droite dans un vide TableNib.xib fichier. À l'intérieur, définir la propriétaire du fichier à votre ViewController de classe et d'utiliser une prise de courant de référence de la tableView.
et
Maintenant, dans votre vue-contrôleur, vous pouvez déléguer la tableView comme vous le feriez normalement, comme
À créer sur mesure vos cellules, à nouveau, la chute d'une Vue de la Table de la Cellule objet dans un vide TableCellNib.xib fichier. Cette fois, dans la cellule .xib fichier que vous n'avez pas à spécifier un "propriétaire", mais vous ne devez spécifier un Classe Personnalisée et un identificateur comme "TableCellId"
Créer votre sous-classe avec quelque points de vente vous avez besoin, comme si
Enfin... de retour à votre point de Vue Contrôleur, vous pouvez charger et afficher la totalité de la chose comme
Le code suivant montre comment vous pouvez simplement charger et afficher un fichier nib (la table), et deuxièmement comment enregistrer une plume pour l'utilisation des cellules.
Espérons que cette aide!!!
let tableCellId = "myAwesomeCell"
. J'ai ajouté une autre image pour vous aider.Swift 4
Registre Plume
Dans TableView Source De Données
Une autre méthode qui peut travailler pour vous (c'est la façon dont je le fais) est l'enregistrement d'une catégorie.
Supposons que vous créez un personnalisé tableView comme suit:
Vous pouvez ensuite enregistrer cette cellule, quelle que soit la UITableViewController vous sera afficher dans avec "registerClass":
Et vous pouvez l'appeler comme vous le souhaitez dans la cellule de ligne de la méthode:
Vous n'avez pas inscrit votre plume comme ci-dessous:
Pour fixer le "méthode de remplacement... a type incompatible..." erreur, j'ai changé la déclaration de la fonction à
(a
-> UITableViewCell!
-- avec le point d'exclamation à la fin)swift 4.1.2
xib.
Créer ImageCell2.swift
Étape 1
l'étape 2 . Selon Viewcontroller classe
Simple de prendre un xib avec classe UITableViewCell. Définir l'INTERFACE utilisateur par reuirement et attribuer IBOutlet. L'utiliser dans cellForRowAt() de la vue de la table comme ceci:
100% travaillant sans aucun problème (Testé)