Cargue varias celdas uitableview bajo una xib en swift

Sé que es posible que podamos cargar varias celdas uitableview bajo una xib en el Objetivo C, pero ¿es posible también en Swift?

Intenté usar la misma lógica que utilicé en Objective C

var cellAuditDetails:AuditDetailsTableViewCell! = tableView.dequeueReusableCellWithIdentifier("customTrialDetailsCell", forIndexPath: indexPath) as! AuditDetailsTableViewCell if indexPath.row == 0{ if(cellAuditDetails == nil) { cellAuditDetails = NSBundle.mainBundle().loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)[0] as! AuditDetailsTableViewCell; } } else{ cellAuditDetails = NSBundle.mainBundle().loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)[1] as! AuditDetailsTableViewCell; } 

introduzca la descripción de la imagen aquí

Pero obtuvo el siguiente error ***Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registenetworking for identifier (customTrialDetailsCell) - nib must contain exactly one top level object which must be a UITableViewCell instance'

Ahora si uso solo una celda, entonces está bien. ¿Pero cómo puedo cargar varias celdas bajo el mismo xib? Porque es irritante tomar otro xib para cada célula nueva.

Es posible si usted distingue las vistas en su XIB (tags, classs personalizadas, etc.), entonces ni siquiera necesita registrar la punta; todo lo que tiene que hacer es esto:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cellIndex = 12345 var cellIdentifier = "MyAwesomeCell" // dequeue cell or, if it doesn't exist yet, create a new one from the nib var cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)! if !cell { var topLevelObjects = Bundle.main.loadNibNamed("MyNibWithLotsOfCustomCells", owner: self, options: nil) var index = (topLevelObjects as NSArray).indexOfObject(passingTest: {(_ obj: Any, _ idx: Int, _ stop: Bool) -> BOOL in // if you distinguish the views by class return type(of: obj) === NSClassFromString(cellIdentifier) // if you distinguish the views by tag return (obj as! UIView).tag == cellIndex }) cell = topLevelObjects[index] } } 

y una cosa más para recordar ese uso

 dequeueReusableCell(withIdentifier:cellIdentifier) 

en lugar de

 dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) 

De alguna manera logré resolver este problema en Swift 3. Gracias a @ waris-shams. Aquí está la solución:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: "customCell") if indexPath.row == 0{ if(cell == nil) { let cellAuditDetails:AuditDetailsTableViewCell = Bundle.main.loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)? [0] as! AuditDetailsTableViewCell cell = cellAuditDetails } } else{ if(cell == nil) { let cellAuditDetails:AuditDetailsTableViewCell = Bundle.main.loadNibNamed("AuditDetailsTableViewCell", owner: self, options: nil)? [1] as! AuditDetailsTableViewCell cell = cellAuditDetails } } }