2010-02-21 10 views
11

Conozco este problema mencionado anteriormente, pero las resoluciones no se aplicaron. Tengo un UINavigationController con un UITableViewController integrado configurado usando IB. En IB, el delegado de UITableView y dataSource están configurados para mi derivación de UITableViewController. Esta clase se ha agregado usando las plantillas de XCode para las clases UITableViewController. No existe una UITableViewCell personalizada y la vista de tabla usa solo estilo simple con solo título.iPhone: didSelectRowAtIndexPath no invocado

Bueno, en el simulador la lista se representa correctamente, con dos elementos proporcionados por dataSource, por lo que dataSource está vinculado correctamente. Si elimino el enlace de salida para dataSource en IB, en su lugar se muestra una tabla vacía.

Tan pronto como toco uno de estos dos elementos, parpadea en azul y el GDB encuentra una interrupción en __forwarding__ en el alcance de UITableView::_selectRowAtIndexPath. No está llegando al punto de interrupción establecido en mi método no vacío didSelectRowIndexPath. Verifiqué los argumentos y el nombre del método para excluir los errores tipográficos que resultan en un selector diferente.

Recientemente no he podido determinar si delegate está configurado correctamente, pero como está configurado de manera equivalente a dataSource que está obteniendo dos elementos de la misma clase, espero que esté configurado correctamente. ¿Así que qué hay de malo?

Estoy ejecutando iPhone/iPad SDK 3.1.2 ... pero probé con el iPhone SDK 3.1 en el simulador también.

EDIT: Este es el código de mi derivación UITableViewController:

#import "LocalBrowserListController.h" 
#import "InstrumentDescriptor.h" 

@implementation LocalBrowserListController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self listLocalInstruments]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [entries count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

    if (([entries count] > 0) && ([indexPath length] > 0)) 
     cell.textLabel.text = [[[entries objectAtIndex:[indexPath indexAtPosition:[indexPath length] - 1]] label] retain]; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (([entries count] > 0) && ([indexPath length] > 0)) 
    { 
     ... 
    } 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

- (void) listLocalInstruments { 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:10]; 

    [result addObject:[InstrumentDescriptor descriptorOn:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"idl"] withLabel:@"Default 1"]]; 
    [result addObject:[InstrumentDescriptor descriptorOn:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"xml"] withLabel:@"Default 2"]]; 

    [entries release]; 
    entries = [[NSArray alloc] initWithArray:result]; 
} 

@end 
+0

Posible duplicado de [Seleccionar fila de vista de tabla mediante programación] (http://stackoverflow.com/questions/2035061/select-tableview-row-programmatically) – jk2K

Respuesta

3

Bueno, después de intentar retener el delegado de la instancia de UITableView solo para verificar si había pérdidas de memoria con éxito, investigué sobre ese tema y tropecé con algunos tutoriales sobre cómo combinar vistas y controladores usando NIB separados como hago aquí. Este tutorial finalmente me hizo hacer el truco:

Combining View Controllers

Centrándose en error en detalle había dos UITableViewControllers ... uno en el principal SEMILLA establece como controlador de raíz para un controlador de navegación con pestañas y una segunda vez en la SEMILLA referenciado utilizado para proporcionar una instancia de UITableView sin formato en su lugar.

+0

link not working :( –

3

Try didSelectRowAtIndexPath. Al selector al escribirlo le faltaba la palabra "At" en el nombre del selector.

son usted que llama


- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition 

Si es así, entonces eso no va a llamar a los métodos de delegado tableView: willSelectRowAtIndexPath: o tableView: didSelectRowAtIndexPath: Usted tendrá que llamar a sí mismo.

Ver el UITableView Reference.

Por lo que vale, no he visto ninguna diferencia en el comportamiento de la vista de tabla en las versiones 3.0.xo 3.1.x.

+0

Gracias por su respuesta. Y perdón por el error tipográfico, por supuesto, el método incluye 'At' ... y no estoy llamando a selectRowAtIndexPath() programáticamente ... todo está reaccionando en el toque de un usuario. Leí la mayoría de las partes de documentos de UITableView sobre su creación y administración de selecciones. Código adjunto de mi clase de controlador derivado anterior. – soletan

+0

Código integrado como 'if ([(UITableView *) delegado self.view]! = Self) {...}' en 'viewDidLoad' y antes de regresar de' tableView: cellForRowAtIndexPath: 'para verificar si el delegado coincide con' self' . Además, en iPad Simulator tocando elementos existentes no interrumpa el depurador, pero seleccione elementos sin ingresar didSelectRowAtIndexPath ... parece que XCode se comporta como Word 97 al editar la página 100 en el documento. – soletan

89

La documentación de Apple dice que didSelectRowAtIndexPath:index no se invocará cuando se llame al selectRowAtIndexPath:indexPath. Para llamar a didSelectRowAtIndexPath utilizar los siguientes:

[[tableView delegate] tableView:tableView didSelectRowAtIndexPath:index];

Esto básicamente invoca el delegado.

+13

Eso es bastante ingrato Una de las mejores cosas de StackOverflow es que ayuda a la comunidad, no solo a un individuo. Personalmente, encontré que esta respuesta era justo lo que necesitaba. Gracias RPM. –

+0

@soletan I Creo que mi respuesta debe ser seleccionada como la respuesta aceptada. Solo digo ';-) – RPM

+1

Esta respuesta explica claramente el motivo y solucionó mi problema. ¡Gracias! – JonSlowCN

Cuestiones relacionadas