ios - uitableviewcell - Cómo seleccionar mediante programación una fila en UITableView en Swift 1.2(Xcode 6.4)
uitableviewcell swift (5)
Necesito seleccionar una fila en un programa UITableView utilizando XML Xcode 6.4 / Swift 1.2.
Este es el código simple:
var index = NSIndexPath(forRow: 0, inSection: 0)
self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
self.tableView(self.tableView, didSelectRowAtIndexPath: index)
Lo anterior me da el siguiente error:
No se puede invocar ''selectRowAtIndexPath'' con una lista de argumentos de tipo ''(NSIndexPath !, animated: Bool, scrollPosition: UITableViewScrollPosition)''
¿Qué pasa con mi código? ¿Tal vez alguien más experimentó esto con Swift 1.2?
¡Cualquier ayuda es muy apreciada!
Aclamaciones
EDITAR: Mi UItableView se ha creado en IB en el UIViewController que estoy intentando llamar al código anterior. Cuando coloco el código en un UITableViewController, el compilador no da ningún error. ¿Necesito insertar un UITableViewController en un contenedor o hay otra forma?
Swift 3.x
si quieres hacerlo en la ''creación celular'', puedes hacerlo así
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = TableViewCell()
let item = items[indexPath.row]
cell.textLabel?.text = item.title
if (item.checked) {
tableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
}
return cell
}
La declaración
self.tableView.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
asume que tableView
es una propiedad del controlador de vista, conectado a una vista de tabla en el guión gráfico. Un UITableViewController
, por ejemplo, ya tiene esta propiedad.
En su caso, el controlador de vista no es un controlador de vista de tabla sino una subclase de un UIViewController
. También tiene una toma de corriente que está conectada a la vista de tabla, pero no se llama tableView
sino menuTable
. Entonces, por supuesto, tienes que llamar
self.menuTable.selectRowAtIndexPath(index, animated: true, scrollPosition: UITableViewScrollPosition.Middle)
para seleccionar una fila de esa vista de tabla.
Los extraños mensajes de error son causados por el hecho de que self.tableView
también puede ser entendido por el compilador como una "función al curry" (compare http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/ ).
Usando Swift 2.x , como lo describe Pankaj purohit, responde que el método correcto es:
func tapRowAtIndex(index:Int) {
let rowToSelect:NSIndexPath = NSIndexPath(forRow: index, inSection: 0)
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None)
self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect)
}
Tenga en cuenta que si llama a este método desde una clase externa, por ejemplo, no sabe cuándo TableView ha terminado su carga, entonces, ¿cuáles son las posibilidades ?, ¿cómo solucionar este problema? :
Paso uno : crea una clase boolean var
var automatingTap: Bool = false
Paso dos : verifique cuando la mesa termine de cargarse e inicie un método de "operaciones finales":
func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
{
let lastRowIndex = tableView.numberOfRowsInSection(0)
if indexPath.row == lastRowIndex - 1 {
endOperations()
}
}
func endOperations()
{
print("finished loading")
if automatingTap {
tapRowAtIndex(0)
automatingTap = false
}
}
Paso tres : llamar a mi clase tableView de otra clase
por ejemplo:
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
if segue!.identifier == "DetailsTableView" {
let viewController:ViewController = segue!.destinationViewController as ViewController
viewController.automatingTap = true
}
}
Use el código siguiente, luego de cargar su vista de tabla con datos:
let rowToSelect:NSIndexPath = NSIndexPath(forRow: 0, inSection: 0); //slecting 0th row with 0th section
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None);
ahora, tiene que llamar manualmente a didSelectRowAtIndexPath: delegar el método usando el siguiente código:
self.tableView(self.tableView, didSelectRowAtIndexPath: rowToSelect); //Manually trigger the row to select
Gracias.
Solución Swift 3.x
Seleccionando una fila
let indexPath = IndexPath(row: 0, section: 0)
myTableView.selectRow(at: indexPath, animated: true, scrollPosition: .bottom)
myTableView.delegate?.tableView!(myTableView, didSelectRowAt: indexPath)
DeSelecting a Row
let deselectIndexPath = IndexPath(row: 7, section: 0)
myTableView.deselectRow(at: deselectIndexPath, animated: true)
myTableView.delegate?.tableView!(myTableView, didDeselectRowAt: indexPath)