2012-09-06 37 views
26

Estoy creando un botón de divulgación de detalles que se está completando utilizando una matriz .... Sin embargo, la función accessoryButtonTappedForRowWithIndexPath: no se está llamando en mi clase. es un delegado tableviewdelegate y tableviewdatasource.accesorioButtonTappedForRowWithIndexPath: no se llama.

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 
    NSLog(@"reaching accessoryButtonTappedForRowWithIndexPath:"); 
    [self performSegueWithIdentifier:@"modaltodetails" sender:[self.eventsTable cellForRowAtIndexPath:indexPath]]; 
} 

La impresión isnt NSLog a la consola que me lleva a creer que la tampoco función que se llama ... Esto es, por supuesto, cuando selecciono en una célula. Una captura de pantalla a continuación muestra cómo tengo la configuración de mi celular.

enter image description here

+0

¿Seguro ha conectado la fuente de datos y delegado a la clase apropiada? ¿Se llama el método '- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath' ? – Thermometer

+0

sí (vacío) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) se llama a indexPath. – jimbob

Respuesta

7

es lo que acabas clic en la celda para seleccionarla o ¿Te ha hecho clic en el botón indicador de accesorios de la célula? No está claro de tu pregunta.

accessoryButtonTappedForRowWithIndexPath es aplicable cuando hace clic en el icono del botón dentro de la celda y no cuando selecciona la celda.

+0

hizo clic en el botón – jimbob

+0

¿Ha realizado todas las conexiones necesarias ... tanto fuente de datos de vista de tabla como delegada en el propietario del archivo? – Coder

+0

¿averiguaste cuál era el problema? – Coder

54

El documento dice que no se llama al método tableView:accessoryButtonTappedForRowWithIndexPath: cuando se establece una vista de accesorio para la fila en indexPath. El método solo se invoca cuando la propiedad accessoryView es nula y cuando se usa y establece la propiedad accessoryType para mostrar una vista de accesorios incorporada. Según tengo entendido, accessoryView y accessoryType son mutuamente excluyentes. Al usar accessoryType, el sistema llamará al tableView:accessoryButtonTappedForRowWithIndexPath: como se esperaba, pero debe manejarlo usted mismo en el otro caso.

La forma en que Apple hace esto se muestra en el proyecto de ejemplo Accessory del SDK. En el método cellForRowAtIndexPath del delegado de dataSource, establecen un objetivo/acción en un botón de accesorio personalizado. Pues no se puede pasar el indexPath a la acción, que ellos llaman un método auxiliar para recuperar el indexPath correspondiente y pasan el resultado al método delegado:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    ... 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    ... 

    // set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet 
    [button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 
    ... 
    cell.accessoryView = button; 

    return cell; 
} 


- (void)checkButtonTapped:(id)sender event:(id)event{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if (indexPath != nil){ 
     [self tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath]; 
    } 
} 

Por alguna razón, su configuración parece caer en el Accesorio caso de vista. ¿Has intentado configurar el AccessType con código en lugar de usar el Interface Builder?

+0

Me encontré con el mismo problema y me pregunto si hay un error en Xcode 4.5 IB que está configurando un 'AccessoryView' en lugar de un' AccesoryType' cuando selecciona el Accesorio en el panel del inspector TableViewCell.¡Si crea un segue haciendo clic y arrastrando del indicador de divulgación que tampoco funciona! – drew

+4

Actualización rápida: parece que si configura el tipo de accesorio como 'DetailDisclosure' en lugar de simplemente' Disclosure', se llama al método 'accessoryButtonTappedForRowWithIndexPath' y funciona un segue desencadenado. Todavía no sé por qué, pero al menos puedes avanzar un poco (incluso si tu UI no se ve como quieres). – drew

+1

Entonces, ¿esto es un error en Xcode, o comportamiento previsto? Los documentos de Apple son angustiosamente poco claros sobre esto. Hay dos tipos de indicadores de divulgación en una celda de tabla: Divulgación simple y Divulgación detallada, pero los documentos solo dicen "el botón de divulgación". – SteveCaine

2

drew is spot on.

Si cambia a 'DetailDisclosure' en Storyboard, se iniciará el método. (XCode 4,6 DP3)

36

Esto parece muy relevante ...

indicador de Divulgación: Cuando este elemento está presente, los usuarios saben que pueden tocar en cualquier lugar en la fila para ver el siguiente nivel en la jerarquía o la elecciones asociadas con el elemento de la lista. Use un indicador de divulgación en una fila cuando seleccione los resultados de la fila en la pantalla de otra lista. No use un indicador de divulgación para revelar información detallada sobre el elemento de la lista; en su lugar, use un botón de divulgación de detalles para este propósito.

Botón de divulgación detallada: Los usuarios tocan este elemento para ver información detallada sobre el elemento de la lista. (Tenga en cuenta que puede usar este elemento en vistas que no sean vistas de tabla, para revelar detalles adicionales sobre algo, consulte "Botones de divulgación de detalles" para obtener más información.) En una vista de tabla, use un botón de divulgación de detalles en una fila para mostrar detalles sobre el elemento de la lista. Tenga en cuenta que el botón de divulgación de detalles, a diferencia del indicador de divulgación, puede realizar una acción que es independiente de la selección de la fila.Por ejemplo, en Favoritos del teléfono, al tocar la fila se inicia una llamada al contacto; al tocar el botón de divulgación de detalles en la fila, se obtiene más información sobre el contacto. comportamiento

+1

Enlace para obtener más información: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/Controls.html –

+0

encontré este problema y esta solución funcionó para mí – sapatos

8

De acuerdo con la documentación del UITableViewCellAccessoryType se espera:

typedef enum : NSInteger {  
UITableViewCellAccessoryNone, 
UITableViewCellAccessoryDisclosureIndicator, 
UITableViewCellAccessoryDetailDisclosureButton, 
UITableViewCellAccessoryCheckmark, 
UITableViewCellAccessoryDetailButton } UITableViewCellAccessoryType; 

Constantes UITableViewCellAccessoryNone La celda no tiene ningún punto de vista accesorio. Este es el valor predeterminado.

UITableViewCellAccessoryDisclosureIndicator La celda tiene un control de accesorio con forma de cheurón. Este control indica que al tocar la celda se activa una acción de inserción. El control no rastrea toques.

UITableViewCellAccessoryDetailDisclosureButton La celda tiene un botón de información y una imagen de chevron como contenido. Este control indica que tocando la celda permite al usuario configurar los contenidos de la celda. El control pistas toca.

UITableViewCellAccessoryCheckmark La celda tiene una marca de verificación en su lado derecho . Este control no rastrea toques. El delegado de la vista de tabla puede administrar las marcas de verificación en una sección de filas (posiblemente limitando la marca de verificación a una fila de la sección) en su método tableView: didSelectRowAtIndexPath :.

UITableViewCellAccessoryDetailButton La celda tiene un botón de información sin un cheurón. Este control indica que al tocar la celda se muestra información adicional sobre el contenido de la celda. El control pistas toca.

0

Esta es otra forma de manejar el botón de divulgación utilizando el guión gráfico. Debería hacer clic en la celda de la vista de tabla e ir al Inspector de conexiones. Hay una sección llamada Segmentos desencadenados, y puede arrastrar desde la línea de selección al UIViewController al que desea seguar. La transición ocurrirá automáticamente y puede capturar prepareForSegue para capturar la notificación cuando lo haga.
La función accessoryButtonTappedForRowWithIndexPath nunca se invoca para el botón de divulgación. Solo se solicita el botón de divulgación detallada.

3

la conversión de la respuesta de arriba a Swift 3:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    ... 
    let unseletcedImage = UIImage(named: "<imagename>") 
    let seletcedImage = UIImage(named: "<imagename>") 
    let button = UIButton(type: .custom) 
    // match the button's size with the image size 
    let frame = CGRect(x: CGFloat(0.0), y: CGFloat(0.0), width: CGFloat((unseletcedImage?.size.width)!), height: CGFloat((unseletcedImage?.size.height)!)) 
    button.frame = frame 
    button.setBackgroundImage(unseletcedImage, for: .normal) 
    button.setBackgroundImage(seletcedImage, for: .selected) 
    cell?.accessoryView = button 
    let action = #selector(checkButtonTapped(sender:event:)) 
    (cell?.accessoryView as? UIButton)?.addTarget(self, action: action, for: .touchUpInside) 
    .... 
    return cell! 

} 

@objc func checkButtonTapped(sender: UIButton?, event: UIEvent) { 
    let touches = event.allTouches 
    let touch = touches!.first 
    guard let touchPosition = touch?.location(in: self.tableView) else { 
     return 
    } 
    if let indexPath = tableView.indexPathForRow(at: touchPosition) { 
     tableView(self.tableView, accessoryButtonTappedForRowWith: indexPath) 
    } 
}