/ / iPhone: didSelectRowAtIndexPath nie wywołano - iphone, uitableview

iPhone: nie wywołano didSelectRowAtIndexPath - iphone, uitableview

Wiem, że wspomniana kwestia została wcześniej wspomniana, aleRozwiązania tam nie wystąpiły. Mam kontroler UINavigationController z wbudowanym sterownikiem UITableViewController skonfigurowanym przy użyciu IB. W IB delegat UITableView i dataSource są ustawione na moją pochodną UITableViewController, która została dodana przy użyciu szablonów XCode dla klas UITableViewController. Nie ma niestandardowej opcji UITableViewCell, a widok tabeli używa domyślnego zwykłego stylu tylko z jednym tytułem.

W symulatorze lista jest poprawnie wyświetlana,z dwoma elementami dostarczonymi przez źródło danych, więc źródło danych jest poprawnie połączone. Jeśli usunę łącze wyjściowe dla źródła danych w IB, zamiast niego zostanie wyświetlona pusta tabela.

Gdy tylko dotknę jednego z tych dwóch elementów, miga na niebiesko, a GDB napotyka przerwę __forwarding__ w zakresie a UITableView::_selectRowAtIndexPath. Nie osiąga punktu przerwania w mojej niepustej metodzie didSelectRowIndexPath. Sprawdziłem argumenty i nazwę metody, aby wykluczyć literówki powodujące inny selektor.

Niedawno nie udało mi się zdobyć delegatapoprawnie ustawione, ale ponieważ jest ustawione równoważnie do źródła danych, które pobiera dwa elementy z tej samej klasy, oczekuję, że zostanie poprawnie ustawione. Co jest nie tak?

Używam iPhone'a / iPada SDK 3.1.2 ... ale wypróbowałem także iPhone'a SDK 3.1 w symulatorze.

EDYTOWANIE: Jest to kod pochodnej mojego 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

Odpowiedzi:

89 dla odpowiedzi № 1

Dokumentacja Apple mówi, że didSelectRowAtIndexPath:index nie zostanie wywołany, gdy selectRowAtIndexPath:indexPath jest nazywany. Zadzwonić didSelectRowAtIndexPath użyj:

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

To w zasadzie wywołuje delegata.


3 dla odpowiedzi № 2

Wypróbuj didSelectRowAtIndexPath. W selektorze podczas wpisywania brakowało słowa "At" w nazwie selektora.

Dzwonisz


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

Jeśli tak, to nie będzie wywoływać metod delegowanych tableView: willSelectRowAtIndexPath: lub tableView: didSelectRowAtIndexPath: Będziesz musiał sam do nich zadzwonić.

Zobacz UITableView Reference.

Za to, co jest warte, nie widziałem żadnej różnicy w zachowaniu widoku tabeli w wydaniach 3.0.x lub 3.1.x.


3 dla odpowiedzi nr 3

Cóż, po próbie zatrzymania delegataInstancja UITableView tylko po to, by sprawdzić, czy pamięć nie działa poprawnie, zbadałem tę kwestię i natknąłem się na kilka tutoriali na temat łączenia widoków i kontrolerów przy użyciu odłączonych NIB-ów, tak jak tutaj. Ten samouczek w końcu wpadł mi w ręce:

Łącząc kontrolery widoku

Koncentrując się na szczegółowym błędzie, były dwaUITableViewControllers ... jeden w głównym zestawie NIB jako kontroler główny dla kontrolera nawigacyjnego z zakładkami i drugi raz w referencyjnym NIB używanym do zapewnienia nieprzetworzonej instancji UITableView.