2011-07-11 18 views
9

Mam kilka widoków tabel w mojej aplikacji. Jestem zaznajomiony z typowym zachowaniem tabel, który po wybraniu wiersza i przejściu do widoku pchanego zmienia kolor na niebieski, a po powrocie pozostaje niebieski przez ułamek sekundy, a następnie zmienia kolor na biały, aby powiadomić użytkownika. z tego, który rząd został właśnie wybrany.UITableView nie zachowuje wiersza wybranego po powrocie

To działało idealnie, aż do niedawna, kiedy zauważyłem, że nie zrobił ostatni kawałek co opisałem: to nie była niebieska do tego ułamek sekundy ...

nie mam pojęcia dlaczego, ale po czytając kilka pokrewnych postów na tej stronie zdałem sobie sprawę, że fragment kodu, który się nazywał, jest w metodzie "viewDidAppear". To, co mnie myli, to to, że nie zastępuję tej metody, ale testowałem ją przy pomocy NSLog, aby pokazać mi ścieżkę indeksu dla wiersza, którego powinien on odznaczyć, który powrócił (null).

Prowadzi mnie to do wniosku, że tableView przedwcześnie odznacza wiersz.

Poniżej jest moja metoda didSelectRowForIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"Selected row at index path: %@", indexPath); 

    //setting our view controller as what we want 
    TripDetails *detailViewController = [[TripDetails alloc] initWithNibName:@"TripDetails" bundle:nil]; 
    self.tripsDetailViewController = detailViewController; 
    [detailViewController release]; 


// Pass the selected object to the new view controller. 
    NSLog(@"Passing trip..."); 
    self.tripsDetailViewController.selectedTrip = [fetchedResultsController objectAtIndexPath:indexPath]; 

    //Hide the bottom bar on pushed view 
    tripsDetailViewController.hidesBottomBarWhenPushed = YES; 

    [self.navigationController pushViewController:tripsDetailViewController animated:YES]; 

} 

Każda pomoc jest mile widziana, thanks :)


EDIT: Fixed

mam to działa .... Wydaje I wywołał metodę [self.tableView reloadData] w mojej metodzie viewWillAppear, która spowodowała odznaczenie wszystkich komórek w tabeli. Poniżej znajduje się moja zmodyfikowana metoda viewDidLoad. Dzięki za sugestie!

- (void)viewWillAppear:(BOOL)animated 
{ 
NSLog(@"running viewWIllAppear for TripsTable"); 

//Getting indexpath for highlighened cell, to rehighlight 
NSIndexPath *selectedIndex = [self.tableView indexPathForSelectedRow]; 

//Refreshing Table - Implement an if statement on the condition that the data has  changed 
[self viewDidLoad]; 
[self.tableView reloadData]; 

//Re select cell 
[self.tableView selectRowAtIndexPath:selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone]; 


[super viewWillAppear:animated]; 
} 
+1

Strzał w ciemności: Być może poprzedni kontroler widoku jest rozładowany z powodu zużycia pamięci. Może to prowadzić do tego zachowania. – dasdom

Odpowiedz

9

Spróbuj

[tableView deselectRowAtIndexPath:indexPath animated:NO];

do odznaczając wiersz i

[tableView selectRowAtIndexPath:indexPath animated:NO]; 

podświetlania wybrany wiersz.

1

Użyj tego kawałek kodu w końcu didSelectRowAtIndexPath metody delegata widoku tabeli,

[tableView deselectRowAtIndexPath:indexPath animated:NO]; 
2

najwyraźniej viewWillAppear: z UITableView klasy ma odznaczyć wszystkie komórki, nawet bez przeładowania komórek. Sztuką opisane pracował dla mnie:

kod

z mojego UITablViewController:

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSIndexPath *selectedIndex = [self.tableView indexPathForSelectedRow]; 

    [super viewWillAppear:animated]; 

    //Re select cell 
    [self.tableView selectRowAtIndexPath:selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone]; 
}; 
+0

Tego właśnie podejrzewałem ... Uwaga: nigdy nie używaj ponownie UITableViewController! : p – Giovanni

+1

To jest nieprawidłowe i powinno zostać wycofane. Jest kontrolowany przez clearsSelectionOnViewWillAppear, patrz odpowiedź @ jankoen powyżej (i mój komentarz) –

29

Jego funkcję można wyłączyć.

W UITableViewController można nazwać

[ self setClearsSelectionOnViewWillAppear:NO ]; 

Jest to bezpośrednio z pliku "UITableViewController.h". Ta funkcja jest tam udokumentowana.

@property(nonatomic) BOOL clearsSelectionOnViewWillAppear __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_2); 
// defaults to YES. If YES, any selection is cleared in viewWillAppear: 
+0

Dzięki, zrobiłem to za mnie! – Mike

+0

Próbowałem znaleźć tę właściwość w nagłówku 'UITableView':/ – rounak

+2

Należy pamiętać, że począwszy od Xcode 6.3/iOS 8.3 to ustawienie nie jest trwałe po ustawieniu w IB/scenorysach/XIB. Możesz zaznaczyć to pole, ale nie jest ono poprawnie zainicjowane; zawsze jest ustawione na true. –

0
NSIndexPath *_selectedIndex ; 

użyć powyższego zmienną globalną do przechowywania w wybrany w widoku tabeli delegata metody

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
_selectedIndex = [self.tableView indexPathForSelectedRow]; 
} 

aw następnym delegata metody UINavigationController delegata

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
[self.tableView selectRowAtIndexPath:_selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone]; 

} 
0

jestem nie jestem pewien, czy to jest istotne, ale jest flaga w UITableViewController po prostu nie Ticed o nazwie

@property(nonatomic) BOOL clearsSelectionOnViewWillAppear NS_AVAILABLE_IOS(3_2); // defaults to YES. If YES, any selection is cleared in viewWillAppear: 

Myślę, że powinno to rozwiązać niektóre z problemów, które opisują tutaj ludzie.

0

Poniższy kod nie działa dobrze

-(void)viewWillAppear:(BOOL)animated{ 
     [super viewWillAppear:YES]; 
     [self setClearsSelectionOnViewWillAppear:NO ]; 
    } 
Powiązane problemy