Tengo un UITableViewCell
que está vinculado a un objeto y necesito saber si la celda es visible. Según la investigación que he realizado, esto significa que necesito acceder de alguna manera al UITableView
que lo contiene (desde allí, hay varias formas de verificar si está visible). Entonces, me pregunto si UITableViewCell
tiene un puntero al UITableView
, o si hay alguna otra forma de obtener un puntero desde la celda.
100
[cell superView]
¿tal vez?Respuestas:
Para evitar verificar la versión de iOS, recorra iterativamente las supervistas desde la vista de la celda hasta que se encuentre un UITableView:
fuente
@property (weak, nonatomic) UITableView *tableView;
y entableView:cellForRowAtIndexPath:
recién establecidocell.tableView = tableView;
.En iOS7 beta 5
UITableViewWrapperView
es la supervista de unUITableViewCell
. TambiénUITableView
hay una supervista de aUITableViewWrapperView
.Entonces, para iOS 7, la solución es
UITableView *tableView = (UITableView *)cell.superview.superview;
Entonces, para iOS hasta iOS 6, la solución es
UITableView *tableView = (UITableView *)cell.superview;
fuente
UITableViewCell
categoría con un nuevo método,relatedTableView
que verifica una versión de iOS y devuelve la supervista adecuada.Extensión Swift 5
Recursivamente
Usando bucle
fuente
view != nil
cheque antes de desenvolver. Sin embargoAntes de iOS7, la supervista de la celda era la
UITableView
que la contenía. A partir de iOS7 GM (es de suponer que también estará en el lanzamiento público), la supervista de la celda es unaUITableViewWrapperView
con su supervista como laUITableView
. Hay dos soluciones al problema.Solución n. ° 1: cree una
UITableViewCell
categoríaEste es un buen reemplazo para el uso
cell.superview
, facilita la refactorización de su código existente: simplemente busque y reemplace[cell relatedTable]
y agregue una afirmación para asegurarse de que si la jerarquía de la vista cambia o se revierte en el futuro, se mostrará de inmediato. en tus pruebas.Solución # 2: agregue una
UITableView
referencia débil aUITableViewCell
Este es un diseño mucho mejor, aunque requerirá un poco más de refactorización de código para usarlo en proyectos existentes. En su
tableView:cellForRowAtIndexPath
uso SOUITableViewCell como su clase de celda o asegúrese de que su clase de celda personalizada sea subclasificadaSOUITableViewCell
y asigne el tableView a la propiedad tableView de la celda. Dentro de la celda, puede consultar la vista de tabla que contiene usandoself.tableView
.fuente
[self.superview.superview isKindOfClass:[UITableView class]]
debería ser la primera, porque iOS 7 es cada vez más.Si es visible, entonces tiene una supervista. Y ... sorpresa ... la supervista es un objeto UITableView.
Sin embargo, tener una supervista no es garantía de estar en pantalla. Pero UITableView proporciona métodos para determinar qué celdas son visibles.
Y no, no hay una referencia dedicada de una celda a una tabla. Pero cuando crea una subclase de UITableViewCell, puede introducir uno y configurarlo al crearlo. (Lo hice mucho antes de pensar en la jerarquía de subvista).
Actualización para iOS7: Apple ha cambiado la jerarquía de subvista aquí. Como es habitual cuando se trabaja con cosas que no están documentadas detalladamente, siempre existe el riesgo de que las cosas cambien. Es mucho más económico "rastrear" la jerarquía de vistas hasta que finalmente se encuentre un objeto UITableView.
fuente
Solución Swift 2.2.
Una extensión para UIView que busca de forma recursiva una vista con un tipo específico.
o más compacto (gracias a kabiroberai):
En tu celular simplemente lo llamas:
Tenga en cuenta que UITableViewCell se agrega en UITableView solo después de la ejecución de cellForRowAtIndexPath.
fuente
lookForSuperviewOfType:
cuerpo del método en una línea, haciéndolo incluso rápido:return superview as? T ?? superview?.superviewOfType(type)
Lo que sea que pueda hacer al llamar a SuperView oa través de la cadena de respuesta, será muy frágil. La mejor manera de hacer esto, si las celdas quieren saber algo, es pasar un objeto a la celda que responda a algún método que responda a la pregunta que la celda quiere hacer, y hacer que el controlador implemente la lógica de determinar qué responder. (a partir de su pregunta, supongo que la celda quiere saber si algo es visible o no).
Cree un protocolo de delegado en la celda, establezca el delegado de la celda en tableViewController y mueva toda la lógica de "control" de la interfaz de usuario en el tableViewCotroller.
Las celdas de la vista de tabla deben ser una vista dum que solo mostrará información.
fuente
Creé una categoría en UITableViewCell para obtener su tableView principal:
Mejor,
fuente
Aquí está la versión Swift basada en las respuestas anteriores. He generalizado
ExtendedCell
para su uso posterior.Espero que esto ayude :)
fuente
UITableViewWrapperView
Basé esta solución en la sugerencia de Gabe de que el objeto es la supervista delUITableViewCell
objeto en iOS7 beta5.Subclase
UITableviewCell
:fuente
Tomé prestado y modifiqué un poco la respuesta anterior y se me ocurrió el siguiente fragmento.
Pasar en clase ofrece la flexibilidad para atravesar y obtener vistas distintas de UITableView en otras ocasiones.
fuente
Mi solución a este problema es algo similar a otras soluciones, pero usa un bucle for elegante y es corta. También debería estar preparado para el futuro:
fuente
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
fuente
En lugar de supervista, intente usar ["UItableViewvariable" visibleCells].
Lo usé en un bucle foreach para recorrer las celdas que vio la aplicación y funcionó.
Funciona de maravilla.
fuente
Mínimamente probado, pero este ejemplo de Swift 3 no genérico parece funcionar:
fuente
este código
`UITableView *tblView=[cell superview];
le dará una instancia de UItableview que contiene la celda de vista de tabulaciónfuente
Le sugiero que recorra la jerarquía de vistas de esta manera para encontrar el UITableView principal:
De lo contrario, su código se romperá cuando Apple cambie la jerarquía de vista nuevamente .
Otra respuesta que también atraviesa la jerarquía es recursiva.
fuente
http://www.curiousfind.com/blog/646 Gracias
fuente
Puede obtenerlo con una línea de código.
fuente
fuente
de la respuesta de @idris escribí una expansión para UITableViewCell en Swift
fuente