Si me elimine

tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?)

Me sale un error en la línea

let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

que dice UITableView? does not have a member named 'dequeueReusableCellWithIdentifier'

Si me desenvuelva el formato tableview, a continuación, el error desaparece, pero en Objective-C que normalmente sería comprobar si es o no la célula existe, y si no nos cree una nueva. En Swift, ya que el repetitivo siempre utiliza el let palabra clave y se desenvuelve opcional, no podemos reasignar si es nil.

¿Cuál es la forma correcta de usar dequeueReusableCellWithIdentifier en Swift?

  • con respecto a la célula podría ser nulo. no, no con este método. docs: «UITableViewCell objeto de la reutilización de identificador. Este método siempre devuelve una celda válida»
  • El que me confunde también porque recuerdo la ObjC días en los que se comprueban para nil en caso de que no hubo ninguna célula para la reutilización, y si nil creado una nueva celda con la reuseIdentifier. He leído el actual Apple doc de nuevo y dice: «Este método dequeues una célula existente, si está disponible o crea uno nuevo con la clase o archivo nib se ha registrado anteriormente.» Así, la función no tanto para nosotros ahora, lo cual es bueno. Ver este debate, aunque, hay 2 de la cola de llamadas–uno vuelve opcional, y el otro no: enlace
InformationsquelleAutor JuJoDi | 2014-06-28

5 Comentarios

  1. 40

    Puede implícitamente desplegar los parámetros para el método y echó el resultado de dequeueReusableCellWithIdentifier para dar el siguiente sucinta código:

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell
    
        //configure your cell
    
        return cell
    }
    • Esta es la respuesta que puedo con – la principal diferencia es el uso de ! (de forma implícita envueltos opcional) en lugar de ? en la definición de la función (solo señalar que para aquellos a los que no de inmediato se nota la diferencia). Yo también creo que el texto modelo proporcionado por Apple en XCode 6 reemplazará su definición con este así.
  2. 26

    Si el tipo de célula no ha sido registrado con la vista de la tabla antes de la tabla de cargas, puede utilizar el siguiente a la obtención de un celular ejemplo:

    private let cellReuseIdentifier: String = "yourCellReuseIdentifier"
    
    //MARK: UITableViewDataSource
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
      var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier)
      if (cell == nil) {
        cell = UITableViewCell(style:UITableViewCellStyle.Subtitle, reuseIdentifier:cellReuseIdentifier)
      }
      cell!.textLabel!.text = "Hello World"
      return cell!
    }
    • Proporciona una advertencia en swift 2.0: Conditional cast from 'UITableViewCell' to 'UITableViewCell' always succeeds
    • Sólo se necesita quitar el as?
    • Sí, y creo que la declaración de si if (cell == nil) {… también debe ser eliminado. Da un error como el celular no es de tipo opcional.
    • Hm, a partir de la dequeueReusableCellWithIdentifier doc, el valor devuelto es opcional… developer.apple.com/library/ios/documentation/UIKit/Reference/…:
    • Mi mal. Yo estaba usando dequeueReusableCellWithIdentifier:forIndexPath:), que de acuerdo a la documentación siempre devuelve una celda válida en Swift 2.
    • Estoy un poco confundido en cuanto a por qué hacemos: ` celda = UITableViewCell(estilo:UITableViewCellStyle.Subtítulos, reuseIdentifier:cellReuseIdentifier) ` con este enfoque de la tuya…¿aún tenemos que hacer tableView.registerClass…?! O que ya no es necesario?! Si es necesario, puede usted explicar por qué?

  3. 5

    Usted necesita para desenvolver el formato tableview variable como es opcional

    if let realTableView = tableView {
        let cell = realTableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)
        //etc
    } else {
        //tableView was nil
    }

    o puede acortar por

    tableView?.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath)

    En respuesta a tu pregunta acerca de ‘en Objective-C que normalmente sería comprobar si es o no la célula existe, y si no nos cree una nueva’, dequeueReusableCellWithIdentifier siempre devuelve un celular (siempre y cuando te hayas registrado una clase o una punta para este identificador), por lo que no es necesario crear uno nuevo.

    • dequeueReusableCellWithIdentifier no siempre devuelve una celda, cf documentación
    • Lo siento, quise decir siempre devuelve un celular si has configurado correctamente. He editado para ser más claro
    • Si se utiliza este enfoque en cellForAtIndexPath, ¿cómo se puede volver de la célula?
  4. 3

    En Swift 3 y Swift 4 de la Versión que usted sólo tiene que utilizar esta

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath as IndexPath) as UITableViewCell
            cell.textLabel?.text = "cell number \(indexPath.row)."
    
            //cell code here
    
            return cell
        }

    En Swift 2 Versión

        func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("CellIdentifier", forIndexPath: indexPath) as UITableViewCell
    
     cell.textLabel?.text = "cell number \(indexPath.row)."
    
            //cell code here
    
            return cell
        }
  5. 2

    swift 3 versión:

        func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: IndexPath!) -> UITableViewCell {
          let cell = tableView.dequeueReusableCell(withIdentifier:"CellIdentifier", for: indexPath) as UITableViewCell
          return cell
        }

Dejar respuesta

Please enter your comment!
Please enter your name here