J'essaie de créer une cellule de vue de tableau personnalisée à partir d'une pointe. Je fais référence à cet article ici . Je suis confronté à deux problèmes.
J'ai créé un fichier .xib avec un objet UITableViewCell glissé dessus. J'ai créé une sous-classe de UITableViewCell
et l' ai définie comme classe de la cellule et Cell comme identificateur réutilisable.
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 sans erreur mais lorsque je l'exécute dans le simulateur, il ressemble à ceci.
Dans UITableViewController dans le storyboard, je n'ai rien fait à la cellule. Identifiant vide et pas de sous-classe. J'ai essayé d'ajouter l' identifiant de cellule à la cellule prototype et je l'ai relancé mais j'obtiens le même résultat.
Une autre erreur que j'ai rencontrée est, lorsque j'ai essayé d'implémenter la méthode suivante dans 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 que j'ai mentionné, j'ai changé le cell
formulaire de type du paramètre UITableViewCell
à CustomOneCell
qui est ma sous-classe de UITableViewCell. Mais j'obtiens l'erreur suivante,
Méthode de remplacement avec le sélecteur 'tableView: willDisplayCell: forRowAtIndexPath:' a un type incompatible '(UITableView !, CustomOneCell !, NSIndexPath!) -> ()'
Quelqu'un a une idée de la façon de résoudre ces erreurs? Celles-ci semblaient bien fonctionner en Objective-C.
Je vous remercie.
EDIT: Je viens de remarquer que si je change l'orientation du simulateur en paysage et le remet en portrait, les cellules apparaissent! Je n'arrivais toujours pas à comprendre ce qui se passait. J'ai téléchargé un projet Xcode ici démontrant le problème si vous avez le temps de jeter un coup d'œil rapide.
la source
Voici mon approche utilisant Swift 2 et Xcode 7.3. Cet exemple utilisera un seul ViewController pour charger deux fichiers .xib - un pour UITableView et un pour UITableCellView.
Pour cet exemple, vous pouvez déposer un UITableView directement dans un fichier TableNib .xib vide . À l'intérieur, définissez le propriétaire du fichier sur votre classe ViewController et utilisez une prise pour référencer la tableView.
et
Maintenant, dans votre contrôleur de vue, vous pouvez déléguer la tableView comme vous le feriez normalement, comme ceci
Pour créer votre cellule personnalisée, à nouveau, déposez un objet Cell View Cell dans un fichier TableCellNib .xib vide . Cette fois, dans le fichier .xib de la cellule, vous n'avez pas à spécifier de "propriétaire", mais vous devez spécifier une classe personnalisée et un identifiant comme "TableCellId"
Créez votre sous-classe avec tous les points de vente dont vous avez besoin
Enfin ... de retour dans votre View Controller, vous pouvez charger et afficher le tout comme ça
Le code montre comment vous pouvez simplement charger et afficher un fichier nib (le tableau), et ensuite comment enregistrer une plume pour une utilisation cellulaire.
J'espère que cela t'aides!!!
la source
let tableCellId = "myAwesomeCell"
. J'ai ajouté une autre image pour vous aider.Swift 4
Enregistrer Nib
Dans TableView DataSource
la source
Solution détaillée avec captures d'écran
MyCustomCell.xib
.UITableViewCell
comme racine de votre fichier xib et de tout autre composant visuel souhaité.MyCustomCell
comme sous-classe deUITableViewCell
.ctrl+drag
créez des débouchés pour vos composants visuels.UIViewController
pour utiliser votre cellule personnalisée.la source
MyHeaderView.swift
pour une cellule personnalisée. La.swift
pour une vue en- tête n'a pasidentifier
dansTable View Cell
laAttribute Inspector
. donc ... une erreur d'exécution s'est produite..swift
et intableView?.register(blahblah, forCellReuseIdentifier: "myCell")
? Je pensais que l'un d'eux n'était pas nécessaire mais .. J'ai trouvé que les deux sont essentiels..xib
pour la cellule personnalisée peut contenir plusieursUITableViewCell
donc ...xib
n'est pas suffisant pour .. trouver la cellule correcte.Vous n'avez pas enregistré votre plume comme ci-dessous:
la source
Une autre méthode qui peut fonctionner pour vous (c'est comme ça que je le fais) consiste à enregistrer une classe.
Supposons que vous créez un tableau personnalisé comme suit:
Vous pouvez ensuite enregistrer cette cellule dans n'importe quel UITableViewController dans lequel vous l'afficherez avec "registerClass":
Et vous pouvez l'appeler comme vous vous en doutez dans la méthode cellule pour ligne:
la source
Pour corriger l' erreur "Méthode de remplacement ... a un type incompatible ..." , j'ai changé la déclaration de fonction en
(était
-> UITableViewCell!
- avec un point d'exclamation à la fin)la source
swift 4.1.2
xib.
Créer ImageCell2.swift
Étape 1
étape 2 . Selon la classe Viewcontroller
la source
Je devais m'assurer que lors de la création de la prise, je devais spécifier que je m'accrochais à la cellule, pas au propriétaire de l'objet. Lorsque le menu apparaît pour le nommer, vous devez le sélectionner dans le menu déroulant «objet». Bien sûr, vous devez également déclarer la cellule comme votre classe, pas seulement «TableViewCellClass». Sinon, je continuerais à obtenir la classe non conforme à la clé.
la source
Prenez simplement un xib avec la classe UITableViewCell . Définissez l'interface utilisateur selon les exigences et attribuez IBOutlet. Utilisez-le dans cellForRowAt () de la vue tableau comme ceci:
100% fonctionnant sans aucun problème (testé)
la source