Estoy creando un UITableViewController con Swift idioma y en un método de

override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell?

Que estoy recibiendo este error

NSIndexPath? no tiene un nombre de miembro de la ‘fila’ error en el Swift

y no entiendo por qué.

Este es mi código

import UIKit

class DPBPlainTableViewController: UITableViewController {

    var dataStore: NSArray = NSArray()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.dataStore = ["one","two","three"]

        println(self.dataStore)
    }


    //#pragma mark - Table view data source

    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {

        //Return the number of sections.
        return 1
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {

        //Return the number of rows in the section.
        return self.dataStore.count
    }


    override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "Cell")

        cell.textLabel.text = self.dataStore[indexPath.row]

        return cell
    }

}

Entonces, ¿cómo se puede configurar la celda.texto con la matriz de elemento de almacén de datos?

  • «y no entiendo por qué» Porque NSIndexPath? no es NSIndexPath. Recuerde, un Opcional es una enumeración de envolver el valor «real». Para acceder al valor, usted necesita a desenvolverlo.
  • Las extensiones para NSIndexPath para la fila y la sección se extendió en UIKit en el UITableView.h archivo.
InformationsquelleAutor dpbataller | 2014-06-04

4 Comentarios

  1. 15

    Puede desenvolver el opcional indexPath parámetro con if let...:

    if let row = indexPath?.row {
        cell.textLabel.text = self.dataStore[row]
    }

    o si estás seguro de que indexPath no nil, puede forzar la desenvoltura con !:

    cell.textLabel.text = self.dataStore[indexPath!.row]

    Sólo ten en cuenta que indexPath! en un valor nulo será una excepción en tiempo de ejecución, por lo que la mejor práctica para desenvolver como en el primer ejemplo.

    • Alternativamente, si usted está seguro de que indexPath está definido (es decir, no nil), se puede desdoblar en línea usando la ! sintaxis así: dataStore[indexPath!.row]
    • Gracias Nate Cocinar, empiezo a entender el significado de una ? en una variable. Voy a continuar con las pruebas. Gracias a todos
    • No, no, no, no. Las extensiones para NSIndexPath para la fila y la sección se extendió en UIKit en el UITableView.h archivo.
    • Sí. Sin embargo, el problema aquí es que el OP está tratando de acceder a la fila y de la sección de un Optional<NSIndexPath>, no que NSIndexPath no tiene esas propiedades.
  2. 5

    Usted puede utilizar la opcion de encadenamiento de sintaxis para esta convocatoria (configuración de la celda.textLabel.texto a nil si indexPath es nil):

    cell.textLabel.text = indexPath? ? self.dataStore[indexPath!.row] : nil

    o explícitamente manta (produciendo un error en tiempo de ejecución si indexPath es nil):

    cell.textLabel.text = self.dataStore[indexPath!.row]

    o el uso de la más detallado if let sintaxis sugerida por @NateCook.

    • ¿El opcional de encadenamiento de trabajo en el primer ejemplo? Creo que indexPath?.row evalúa como un Int? y no funciona como un subíndice.
    • Tienes razón… tienes que explícitamente de la prueba. He editado para corregir. Parece que la opcional de encadenamiento de suscripción no es lo suficientemente inteligente como para propagar los nil a través de un subíndice en el opcional de la cadena. A mí se me ocurre que podría ser capaz de hacer una extensión en dataStore que implementa subscript(index: Int?) -> String?, pero se los dejo como ejercicio para el lector.
  3. -2

    Todo lo que tienes que hacer para tener acceso a NSIndexPath‘s de la fila y la sección son para importar el encabezado del archivo donde estas extensiones de la base NSIndexPath clase están definidos.

    Si no, su clase actuará como fila y la sección simplemente no existen en una instancia de NSIndexPath.

    La fila y la sección de extensiones de NSIndexPath se declaran dentro de la UIKit marco dentro UITableView.h.

    Para solucionar este problema, todo lo que necesitas hacer es importar UITableView.h en su clase. Eso es todo.

    Aquí es donde las extensiones de la clase se definen en UITableView.h en Objective-C. estoy seguro de que Swift tiene una sección similar.

    //This category provides convenience methods to make it easier to use an NSIndexPath to represent a section and row
    @interface NSIndexPath (UITableView)
    
    + (instancetype)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;
    
    @property (nonatomic, readonly) NSInteger section;
    @property (nonatomic, readonly) NSInteger row;
    
    @end
    • Ja. Gracias JAL. Usted y yo estábamos agregar el bloque de código de formato, al mismo tiempo, pero se me pegaba a él.
    • Este no es el problema. UITableView.h ya es importado por la importación de UKit. Esta pregunta es viejo y no es relevante ya que de todos modos porque la UITableViewDataSource de los parámetros del método no son opcionales más.
    • Si desea acceder a las propiedades dentro de NSIndexPath que se extienden a través de UITableView.h o UICollectionView.h, y tiene acceso a estas propiedades fuera de su vista controlador, entonces usted necesita para saber qué archivo a importar y por qué. Sólo necesitaba hacer esto en una clase, así que no sé por qué me estás contando es irrelevante. No quiero importar todos UIKit en mi contenedor de datos si todo lo que necesito es una categoría de NSIndexPath. ¿No es eso razonable?
    • Así el autor de la pregunta es acceder a estas propiedades desde el interior de su controlador de vista y ya está la importación de UIKit así que no estoy seguro de nada de lo que usted está diciendo es relevante para esta situación.

Dejar respuesta

Please enter your comment!
Please enter your name here