2010-02-21 13 views
11

Wiem, że wspomniana kwestia została wcześniej wspomniana, ale rezolucje tam nie miały zastosowania. Mam UINavigationController z wbudowanym UITableViewController skonfigurować przy użyciu IB. W IB delegat UITableView i dataSource są ustawione na moją pochodną UITableViewController. Ta klasa 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.iPhone: didSelectRowAtIndexPath nie wywołano

Cóż, w symulatorze lista jest renderowana poprawnie, z dwoma elementami dostarczonymi przez dataSource, 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.

Zaraz po dotknięciu jednego z tych dwóch elementów miga na niebiesko, a GDB napotyka przerwę w numerze __forwarding__ w zakresie 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ę ustalić, czy delegat jest ustawiony prawidłowo, ale ponieważ jest ustawiony równorzędnie ze źródłem danych, który pobiera dwa elementy z tej samej klasy, oczekuję, że zostanie poprawnie ustawiony. Co jest nie tak?

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

EDIT: Jest to kod mojego UITableViewController wyprowadzeniu:

#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

Możliwy duplikat [Wybierz wiersz widoku tabeli programowo] (http://stackoverflow.com/questions/2035061/select-tableview-row-programmically) – jk2K

Odpowiedz

3

Cóż, po próbie zatrzymania delegata instancji UITableView tylko po to, aby sprawdzić, czy pamięć nie działa dobrze, zbadałem ten problem 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 poradnik w końcu mi rade:

Combining View Controllers

koncentrując się na błędzie w szczegółach tam były dwie UITableViewControllers ... jeden w głównej NIB ustawiony jako głównego regulatora na kartach kontrolera nawigacji i po raz drugi w odwołuje NIB używane do zapewnienia zamiast tego surowej instancji UITableView.

+0

link nie działa :( –

3

Spró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, wtedy nie będzie wywoływać metod delegata tableView: willSelectRowAtIndexPath: albo tableView: didSelectRowAtIndexPath: Będziesz mieć do nich zadzwonić samemu.

Zobacz UITableView Reference.

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

+0

Dzięki za odpowiedź. I przepraszam za literówkę, oczywiście metoda zawiera "At" ... i nie wywołuję programowo selectRowAtIndexPath() ... to wszystko reaguje na kran użytkownika. Czytam większość części dokumentacji UITableView dotyczących ich tworzenia i zarządzania wyborami. Dołączony kod mojej pochodnej klasy kontrolera powyżej. – soletan

+0

Zintegrowany kod jak 'if ([(UITableView *) delegat self.view]! = Self) {...}' w 'viewDidLoad' i przed powrotem z' tableView: cellForRowAtIndexPath: 'aby sprawdzić delegata dla dopasowania' self' . Ponadto, w Symulatorze iPada dotknięcie istniejących elementów nie przerywa debaggera, ale wybór elementów bez wprowadzania didSelectRowAtIndexPath ... wygląda jak XCode zachowujący się jak Word 97 przy edycji 100 strony w dokumencie. – soletan

89

Dokumentacja Apple mówi, że didSelectRowAtIndexPath:index nie zostanie wywołany po wywołaniu selectRowAtIndexPath:indexPath. Zadzwonić didSelectRowAtIndexPath użyć następujących:

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

To w zasadzie wywołuje delegata.

+13

To niewdzięczne! Jedną z największych zalet StackOverflow jest pomoc dla społeczności, a nie tylko dla osoby prywatnej, ponieważ ta reakcja była właśnie tym, czego potrzebowałem .. Dzięki RPM –

+0

@soletan I uważam, że moja odpowiedź powinna być wybrana jako zaakceptowana odpowiedź, wystarczy powiedzieć ;-) – RPM

+1

Ta odpowiedź wyjaśniła wyraźnie przyczynę i rozwiązała mój problem. Dzięki! – JonSlowCN

Powiązane problemy