2011-01-13 18 views
5

Estoy en el medio de intentar solucionar un problema con una nueva aplicación, y algo no está bien. En la aplicación, estoy configurando UITableViewCells personalizadas agregando 2 UILabels y 1 UIImageView directamente a cell.contentViewUITableViewCell no siempre seleccionable?

En mi aplicación, ciertas células de la vista de tabla no eran seleccionables (no respondían a eventos tap). La 2da celda en la pantalla nunca fue seleccionable, y luego otras células aleatorias tampoco eran seleccionables.

En mi esfuerzo de depuración, me quitaron todo, hasta las siguientes básico y esencial de código:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"ReviewCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 
    cell.textLabel.text = @"foo"; 
    return cell; 
} 

Incluso esto es código de la placa genérica, caldera, que se parece a lo siguiente:

no todas las celdas son seleccionables.

¿Qué me estoy perdiendo?

actualización

como una actualización aquí es mi código de selección de fila si está interesado

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 
    [self.navigationController pushViewController:rvc animated:YES]; 
    [rvc release], rvc=nil; 
} 
+0

y, presumiblemente, no devuelve nada de una tablaView: willSelectRowAtIndexPath: ¿método o algo? – Brynjar

+0

¿Qué acción está haciendo en * didSelectRowAtIndexPath: * method? – EmptyStack

+0

aquí es mi método didSelectRowAtIndexPath: \t ReviewWebViewController * VCR = [alloc [ReviewWebViewController] initWithReview: [self.reviews objectAtIndex: indexPath.row]]; \t [self.navigationController pushViewController: rvc animated: YES]; \t [versión rvc], rvc = nil; – cpjolicoeur

Respuesta

1

¿Cómo se ve la jerarquía de las vistas? Me vienen a la mente dos cosas: o bien hay otras vistas además de la vista de tabla que podrían estar interceptando los eventos táctiles, o la vista de tabla está fuera de su marco de superviews (y el recorte está desactivado).

En pocas palabras: muchas sugerencias que se centran en la implementación de la vista de tabla en sí, eche un vistazo a todo lo que hay a su alrededor.

+0

Es simplemente un UITableViewController. Nada especial en la vista jerarquía. Creo una UIView y le agrego algunos elementos que luego configuro como tableHeaderView a través de "self.tableView.tableHeaderView = myHeaderView" – cpjolicoeur

+0

y ¿cómo se agrega UITableViewController a la jerarquía? –

+1

Al final, tenía un HUD de carga que interceptaba eventos de clic. En lugar de eliminar el HUD de la supervista cuando se terminó de animar, simplemente estaba deteniendo la animación pero dejando el HUD en su lugar – cpjolicoeur

2

fui golpeado por un error que suene parecido hace unas semanas. Tenía botones en una vista de desplazamiento que no respondían a los toques. Resultó ser un UILabel invisible que dejé en mi archivo IB, nunca llené de texto y olvidé. Estaba sentado sobre los botones e interceptando sus toques.

La forma en que lo encontré fue recorrer todas las subvistas de la vista de desplazamiento, convirtiendo el color de fondo de cada vista en amarillo. ¿Podrías tener una vista perdida que está interfiriendo con los toques?

También podría tratar de cambiar el tamaño de las etiquetas e imágenes en su celda a algo pequeño (10x10) para ver si están interfiriendo. Como último recurso, puede comenzar con un código nuevo y volver a agregar partes para ver dónde se rompe.

Un último punto: Usted dice que usted está utilizando una costumbre UITableViewCell, pero inicializar la celda con el tipo por defecto:

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
           reuseIdentifier:CellIdentifier] autorelease]; 

No deberías estar usando tu teléfono costumbre aquí? ¿Eso es solo para simplificar el ejemplo?

+0

lo siento, un poco más de explicación. No uso IB aquí, así que no creo que tenga UILabels que no pueda ver, pero intentaré su sugerencia sobre colorearlos todos y ver si me perdí algo. por UITableViewCell "personalizado" Quiero decir que estoy agregando mis elementos directamente al cell.contentView directamente, y no usando los elementos predefinidos cell.textView.text y cell.detailedTextView.text que están presentes de manera predeterminada. Estoy agregando manualmente dos UILabels y un UIImageView a cell.contentView manualmente. – cpjolicoeur

+0

para verificar, eliminé todo mi código personalizado y usé lo que pegué arriba y solo configuré el archivo cell.textLabel.text = @ "foo" y todavía no puedo obtener clics consistentes – cpjolicoeur

+0

neven, como una actualización, seguí adelante e hice a "for (UIView * v en cell.subviews)" y configúrelos todos para tener un [UIColor yellowColor] como color de fondo. También configuré manualmente los 3 campos que estoy agregando con los colores de fondo rojo, verde y azul. Aquí hay un enlace a una tapa de pantalla para ilustrar lo que está sucediendo. Las dos primeras celdas no reciben grifos, excepto directamente en el indicador de divulgación (en blanco). La tercera celda puedo hacer clic en cualquier lugar de la celda y el toque está bien registrado. http://cl.ly/3q1c453t1D1r3h3B1D11 – cpjolicoeur

1

He intentado con una aplicación de muestra, que imitaba por completo su enfoque. Todo funcionó absolutamente bien. Me pregunto por qué su código no funciona cuando cada bit de código mencionado arriba es correcto. Si es necesario, puedo compartir mi código contigo. Estoy utilizando el siguiente código

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@"Row Tapped At %d",indexPath.row); 
    NextViewController *rvc = [[NextViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 
    [self.navigationController pushViewController:rvc animated:YES]; 
    [rvc release], rvc=nil; 

} 

donde primera opinión * = [[[alloc Review] initWithReviewId: 1 andTitle: @ "primero"] autorelease]; y así sucesivamente ... self.reviews = [[NSArray alloc] initWithObjects: primero, segundo, tercero, cuarto, quinto, sexto, siete, ocho, nueve, diez, once, doce, trece, catorce, quince, sizteen, nulo];

Estoy usando iPhone SDK 4.2. Por favor avíseme si esto imita su enfoque y corríjame Si he cometido algún error. Gracias

+0

Rahul Gracias por tomarse el tiempo para hacer todo eso. También, he creado proyectos completamente nuevos en xcode desde cero tratando de depurar esto, y no estoy viendo los mismos problemas en proyectos en blanco, solo este. Me gustaría descubrir por qué este no funciona, incluso con la cantidad mínima de código (que es claramente correcto) no funciona. – cpjolicoeur

1

Si la solución de Nevan no funciona, intente eliminar el método tableView: didSelectRowAtIndexPath (o coméntelo) y vea si los botones brillan con la luz azul cuando se tocan. Si lo hacen, entonces sospecho que

ReviewWebViewController *rvc = [[ReviewWebViewController alloc] initWithReview:[self.reviews objectAtIndex:indexPath.row]]; 

No siempre devuelve un objeto. Para confirmar esto, establezca un punto de interrupción en la siguiente línea y verifique que rvc no sea nulo. Si es así, ese es el problema.

+0

He comentado el método como una prueba antes. El problema no es que el rvc no se esté configurando. El método didSelectRowAtIndexPath ni siquiera se llama en algunos grifos para algunas celdas, por lo que no hay nada que depurar en ese método. Cuando se detectan los grifos, las cosas funcionan como se esperaba y rvc está bien configurado, sin embargo, este método generalmente no se activa en los grifos (a menos que toque el indicador de divulgación directamente) – cpjolicoeur

4

Se han mencionado muchas cosas, que no voy a reiterar.

Pero asegúrese de que los elementos que agrega a UITableViewCell tienen su userInteractionEnabled configurado en NO. Especialmente cuando no se usa IB, nunca haga demasiadas suposiciones sobre los valores predeterminados.

1

¿Qué sucede cuando saca el dequeueReusableCellWithIdentifier: codepath, y siempre utiliza una celda nueva? ¿Todos son seleccionables entonces?

¿Hay una vista principal para el UITableViewController cuyo marco podría establecerse más pequeño que los límites de tableView? Si es así, los toques fuera de los límites de este padre no se registrarán en TableView. Todavía vería la vista de tabla completa, siempre y cuando clipSubviews de padre fuera NO.

Además, verifique que la ventana de su aplicación tenga "quiere pantalla completa al iniciarse" en el plumín. De lo contrario, la ventana puede tener un tamaño incorrecto y es posible que los eventos táctiles no lleguen a su vista de tabla.