Estoy tratando de crear una celda de vista de tabla personalizada a partir de una punta. Me refiero a este artículo aquí . Estoy enfrentando dos problemas.
Creé un archivo .xib con un objeto UITableViewCell arrastrado sobre él. Creé una subclase de UITableViewCell
y la configuré como la clase de la celda y Cell como el identificador reutilizable.
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
}
}
En el UITableViewController tengo este código,
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
}
}
Este código no cumple errores, pero cuando lo ejecuto en el simulador, se ve así.
En UITableViewController en el guión gráfico, no he hecho nada a la celda. Identificador en blanco y sin subclase. Intenté agregar el identificador de celda a la celda prototipo y lo ejecuté nuevamente, pero obtengo el mismo resultado.
Otro error que enfrenté es cuando intenté implementar el siguiente método en 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]
}
Como se muestra en el artículo que mencioné, cambié la cell
forma de tipo del parámetroUITableViewCell
al CustomOneCell
que es mi subclase de UITableViewCell. Pero me sale el siguiente error,
Método de anulación con el selector 'tableView: willDisplayCell: forRowAtIndexPath:' tiene un tipo incompatible '(UITableView !, CustomOneCell !, NSIndexPath!) -> ()'
¿Alguien tiene alguna idea de cómo resolver estos errores? Estos parecían funcionar bien en Objective-C.
Gracias.
EDITAR: ¡Acabo de notar que si cambio la orientación del simulador al paisaje y lo vuelvo a hacer vertical, aparecen las celdas! Todavía no podía entender qué está pasando. Subí un proyecto de Xcode aquí que demuestra el problema si tienes tiempo para echar un vistazo rápido.
fuente
Este es mi enfoque usando Swift 2 y Xcode 7.3. Este ejemplo utilizará un único ViewController para cargar dos archivos .xib, uno para UITableView y otro para UITableCellView.
Para este ejemplo, puede soltar un UITableView directamente en un archivo vacío TableNib .xib. En el interior, configure el propietario del archivo a su clase ViewController y use una salida para hacer referencia a tableView.
y
Ahora, en su controlador de vista, puede delegar tableView como lo haría normalmente, así
Para crear su celda personalizada, nuevamente, suelte un objeto Celda de vista de tabla en un archivo vacío TableCellNib .xib. Esta vez, en el archivo .xib de la celda no tiene que especificar un "propietario", pero sí debe especificar una Clase personalizada y un identificador como "TableCellId"
Crea tu subclase con las salidas que necesites
Finalmente ... de vuelta en su controlador de vista, puede cargar y mostrar todo de esta manera
El código muestra cómo puede simplemente cargar y mostrar un archivo plumín (la tabla), y segundo cómo registrar una plumilla para el uso de la celda.
¡¡¡Espero que esto ayude!!!
fuente
let tableCellId = "myAwesomeCell"
. Agregué otra imagen para ayudarte.Swift 4
Registrar punta
En TableView DataSource
fuente
Solución detallada con capturas de pantalla
MyCustomCell.xib
.UITableViewCell
como la raíz de su archivo xib y cualquier otro componente visual que desee.MyCustomCell
como una subclase deUITableViewCell
.ctrl+drag
cree salidas para sus componentes visuales.UIViewController
para usar su celda personalizada.fuente
MyHeaderView.swift
para una celda personalizada. La.swift
vista de cabecera no tieneidentifier
enTable View Cell
en elAttribute Inspector
. entonces ... se produjo un error de tiempo de ejecución..swift
y entableView?.register(blahblah, forCellReuseIdentifier: "myCell")
? Pensé que uno de ellos no es necesario, pero ... descubrí que ambos son esenciales..xib
para la celda personalizada puede contener múltiples,UITableViewCell
entonces ....xib
no es suficiente para ... encontrar la celda correcta.No registró su punta como se muestra a continuación:
fuente
Otro método que puede funcionar para usted (así es como lo hago) es registrar una clase.
Suponga que crea una tableView personalizada como la siguiente:
Luego puede registrar esta celda en cualquier UITableViewController en el que la mostrará con "registerClass":
Y puede llamarlo como esperaría en la celda para el método de fila:
fuente
Para corregir el error "Al anular el método ... tiene un tipo incompatible ..." , he cambiado la declaración de la función a
(estaba
-> UITableViewCell!
- con un signo de exclamación al final)fuente
rápido 4.1.2
xib.
Crear ImageCell2.swift
Paso 1
paso 2 . Según la clase Viewcontroller
fuente
Tenía que asegurarme de que al crear la salida especificara que me estaba conectando a la celda, no al propietario del objeto. Cuando el menú aparece para nombrarlo, debe seleccionarlo en el menú desplegable 'objeto'. Por supuesto, también debe declarar la celda como su clase, no solo 'TableViewCellClass'. De lo contrario, seguiría haciendo que la clase no cumpla con las claves.
fuente
Simplemente tome un xib con la clase UITableViewCell . Establezca la IU según el requisito y asigne IBOutlet. Úselo en cellForRowAt () de la vista de tabla de esta manera:
100% trabajando sin ningún problema (probado)
fuente