Swift: usa un método init diferente para dequeueReusableCellWithIdentifier

Quiero usar mi propia class UITableViewCell, por lo que en el UITableViewController correspondiente escribo

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentitfier, forIndexPath: indexPath) as MyTableViewCell //cellIdentifier is initialized return cell } 

Sin embargo, quiero inicializar mi Celda, ya que tengo que pasar arguments cuando se crea. Los docs de Apple dicen que las llamadas dequeueReusableCellWithIdentifier (si una célula tiene que inicializarse) initWithStyle:reuseIdentifier .

Si hay una celda para reutilizar, el método llama a prepareForReuse .

De cualquier manera, quiero pasar arguments a mi celda antes de ejecutar otros methods (es decir, en la initialization y en prepareForReuse, respectivamente).

¿Cuál es la forma adecuada de hacer esto y hay una manera de usar otros inicializadores como se define en la class que deriva de UITableViewCell (MyTableViewCell)?

Si desea tener un método de init personalizado, debe (a) asegurarse de que no tiene un prototipo de célula definido (porque si lo hace, llamará al inicializador mismo); y (b) su cellForRowAtIndexPath maneja apropiadamente cuando no se encontró una celda reutilizada y, por lo tanto, debe instanciar la suya propia (con los parameters que desee).

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as MyTableViewCell? if cell == nil { cell = MyTableViewCell(param1: "foo", param2: "bar", reuseIdentifier: cellIdentifier) // configure new cell here } else { // reconfigure reused cell here } return cell! } 

Personalmente, sin embargo, no me inclinaría por esa ruta. Prefiero aprovechar los prototypes de celdas y las rutinas de initialization estándar, pero simplemente anular las properties (o llamar a alguna function de configuration) según sea necesario, por ejemplo:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyTableViewCell cell.property1 = "Foo" cell.property2 = "Bar" return cell } 

De esta forma puedo disfrutar el prototipo de célula, la instanciación automática de la class de object de mi celda, el mapeo de IBOutlets e IBActions, etc., pero hago la configuration especial que necesito aquí en cellForRowAtIndexPath .