Tengo un controlador de vista con una vista de tabla y una punta separada para la plantilla de celda de tabla. La plantilla de celda tiene algunos botones. Quiero acceder al clic del botón junto con el índice de la celda en la que se hizo clic dentro del controlador de vista donde he definido la vista de tabla.
Entonces tengo ViewController.h
y ViewController.m
donde tengo el UITableView
y TableTemplate.h
, TableTemplate.m
y TableTemplate.xib
donde tengo definida la punta. Quiero el evento de clic de botón con índice de celda en ViewController.m
.
¿Alguna ayuda sobre cómo puedo hacer eso?
fuente
Los delegados son el camino a seguir.
Como se ve con otras respuestas, el uso de vistas puede quedar desactualizado. Quién sabe mañana, podría haber otro contenedor y tal vez deba usarlo
cell superview]superview]superview]superview]
. Y si usa etiquetas, terminaría con n número de condiciones si no para identificar la celda. Para evitar todo eso, configure delegados. (Al hacerlo, creará una clase de celda reutilizable. Puede usar la misma clase de celda que una clase base y todo lo que tiene que hacer es implementar los métodos de delegado).Primero necesitamos una interfaz (protocolo) que será utilizada por la célula para comunicar (delegar) los clics de los botones. ( Puede crear un archivo .h separado para el protocolo e incluirlo tanto en el controlador de vista de tabla como en las clases de celda personalizadas O simplemente agregarlo en la clase de celda personalizada que de todos modos se incluirá en el controlador de vista de tabla )
Incluya este protocolo en el controlador de vista de tabla y celda personalizado. Y asegúrese de que el controlador de vista de tabla confirme este protocolo.
En la celda personalizada, cree dos propiedades:
En el
UIButton
delegado de IBAction, haga clic en: ( Se puede hacer lo mismo para cualquier acción en la clase de celda personalizada que deba delegarse nuevamente para ver el controlador )En el controlador de vista de tabla
cellForRowAtIndexPath
después de quitar la celda, establezca las propiedades anteriores.E implemente el delegado en el controlador de vista de tabla:
Este sería el enfoque ideal para obtener acciones personalizadas de botón de celda en el controlador de vista de tabla.
fuente
En lugar de jugar con etiquetas, tomé un enfoque diferente. Delegado para mi subclase de UITableViewCell (OptionButtonsCell) y agregué una var indexPath. Desde mi botón en el guión gráfico, conecté @IBAction a OptionButtonsCell y allí envié el método delegado con el indexPath correcto a cualquier persona interesada. En la celda para la ruta del índice configuré indexPath actual y funciona :)
Deje que el código hable por sí mismo:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
fuente
class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate
// error: conformidad redundante de 'MyTableViewController' al protocolo 'UITableViewDataSource'Esto debería ayudar:
Aquí el remitente es la instancia de UIButton que envía el evento. myTableView es la instancia de UITableView con la que está tratando.
Simplemente obtenga la referencia de celda correcta y todo el trabajo está hecho.
Es posible que deba eliminar los botones de contentView de la celda y agregarlos directamente a la instancia de UITableViewCell como subvista.
O
Puede formular un esquema de nombres de etiquetas para diferentes UIButtons en cell.contentView. Con esta etiqueta, más adelante puede conocer la información de la fila y la sección según sea necesario.
fuente
El siguiente código puede ayudarlo.
He tomado
UITableView
con la clase de celda prototipo personalizada nombradaUITableViewCell
dentroUIViewController
.Así que tengo
ViewController.h
,ViewController.m
yTableViewCell.h
,TableViewCell.m
Aquí está el código para eso:
ViewController.h
ViewController.m
Clase de celda personalizada:
y
Nota : Aquí he tomado todo
UIControls
usando Storyboard.Espero que pueda ayudarte ... !!!
fuente
La razón por la que me gusta la técnica a continuación es porque también me ayuda a identificar la sección de la tabla.
Agregar botón en la celda cellForRowAtIndexPath:
Evento addTask:
Espera esta ayuda.
fuente
Use cierres rápidos:
fuente
El código de Tarun no funciona en iOS7, ya que la estructura UITableViewCell cambió y ahora obtendría "UITableViewCellScrollView" en su lugar.
Esta publicación Getting UITableViewCell con superview en iOS 7 tiene una buena solución para crear un bucle para encontrar la vista principal correcta, independientemente de cualquier cambio futuro en la estructura. Se reduce a crear un bucle:
El enlace tiene código para una solución más reutilizable, pero esto debería funcionar.
fuente
Swift 2.2
Necesita agregar objetivo para ese botón.
FunctionName: conectado // por ejemplo
Y, por supuesto, debe configurar la etiqueta de ese botón ya que lo está utilizando.
Puede lograr esto subclasificando UITableViewCell. Úselo en el generador de interfaces, suelte un botón en esa celda, conéctelo a través de una toma de corriente y listo.
Para obtener la etiqueta en la función conectada:
fuente
Swift 3 con cierre
Una buena solución es usar un cierre en un UITableViewCell personalizado para devolver la llamada al viewController para una acción.
En la celda:
En el controlador de vista: delegado de vista de tabla
fuente
Me parece más simple subclasificar el botón dentro de su celda (Swift 3):
En tu clase celular:
En la fuente de datos de la vista de tabla o de la vista de colección, al quitar la celda de la celda, dele al botón su ruta de índice:
Entonces puede simplemente poner este código en su controlador de vista de tabla:
¡Y no olvide configurar la clase del botón en su Interface Builder y vincularlo a la
handleTapOnCellInfoButton
función!editado:
Usando inyección de dependencia. Para configurar una llamada de cierre:
e inyecte el cierre en el método willDisplay del delegado de la vista de colección:
fuente
Es trabajo para mí.
fuente
fuente
para swift 4:
fuente
Si desea pasar el valor del parámetro de la celda a UIViewController usando el cierre, entonces
fuente
La respuesta de @Mani es buena, sin embargo, las etiquetas de vistas dentro de contentView de la celda a menudo se usan para otros fines. En su lugar, puede usar la etiqueta de la celda (o la etiqueta contentView de la celda):
1) En su
cellForRowAtIndexPath:
método, asigne la etiqueta de la celda como índice:2) Agregue objetivo y acción para su botón de la siguiente manera:
3) Crear método que devuelve la fila del remitente (gracias @Stenio Ferreira):
4) Acciones de código basadas en el índice:
fuente
CustomTableCell.h es un UITableViewCell:
MyVC.m después de las importaciones:
Dentro de "cellForRowAtIndexPath" en MyVC.m:
MyVC.m:
fuente
fuente