UITableView не сохраняет выбранную строку по возвращении - PullRequest
9 голосов
/ 11 июля 2011

У меня есть несколько видов таблиц в моем приложении.Я знаком с обычным поведением таблиц: когда вы выбираете строку и переходите к нажатому виду, он становится синим, затем, когда вы возвращаетесь назад, он остается синим в течение доли секунды, а затем становится белым, чтобы уведомить пользователя.из того, какой ряд был только что выбран.

Это прекрасно работало до недавнего времени, когда я заметил, что больше не делал последний бит из того, что я описал: он не оставался синим в течение этой доли секунды ...

Понятия не имею, почему, но после прочтения нескольких похожих постов на этом сайте я понял, что вызываемый фрагмент кода находится в методе viewDidAppear.Что меня смущает, так это то, что я не переопределяю этот метод, но я протестировал его с помощью NSLog, чтобы показать мне путь индекса для строки, которую он должен отменить, что вернуло (null).

Так что это ведетмне поверить, что каким-то образом tableView преждевременно отменяет выбор строки.

Ниже мой метод 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];

}

Любая помощь очень ценится, спасибо:)


РЕДАКТИРОВАТЬ: Исправлено

Я получил это работает .... Кажется, я вызывал метод [self.tableView reloadData] в моем методе viewWillAppear, который затем заставил таблицу отменить выбор всех ячеек.Ниже мой модифицированный метод viewDidLoad.Спасибо за предложения!

- (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];
 }

Ответы [ 7 ]

29 голосов
/ 08 марта 2012

Это функция, которую вы можете отключить.

В UITableViewController вы можете вызвать

[ self setClearsSelectionOnViewWillAppear:NO ];

Это прямо из файла "UITableViewController.h".Эта функция задокументирована там.

   @property(nonatomic) BOOL clearsSelectionOnViewWillAppear __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_2); 
// defaults to YES. If YES, any selection is cleared in viewWillAppear:
9 голосов
/ 11 июля 2011

Попробуйте

[tableView deselectRowAtIndexPath:indexPath animated:NO];

для отмены выбора строки и

[tableView selectRowAtIndexPath:indexPath animated:NO];

для выделения выбранной строки.

2 голосов
/ 16 февраля 2012

очевидно viewWillAppear: класса UITableView отменяет выбор всех ячеек, даже без перезагрузки ячеек. Описанный трюк сработал для меня:

код из моего UITablViewController:

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

    [super viewWillAppear:animated];

    //Re select cell
    [self.tableView selectRowAtIndexPath:selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone];
};
1 голос
/ 11 июля 2011

Используйте этот фрагмент кода в конце метода делегата didSelectRowAtIndexPath табличного представления,

[tableView deselectRowAtIndexPath:indexPath animated:NO];
0 голосов
/ 11 января 2016

Следующий код работает хорошо

   -(void)viewWillAppear:(BOOL)animated{
         [super viewWillAppear:YES];
         [self setClearsSelectionOnViewWillAppear:NO ];
    }
0 голосов
/ 29 октября 2013

Я не уверен, что это актуально, но в UITableViewController есть флаг, который я только что заметил, называется

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

Я думаю, что это должно решить некоторые проблемы, которые люди описывают здесь.

0 голосов
/ 16 января 2013
NSIndexPath *_selectedIndex ;

используйте вышеуказанную глобальную переменную для сохранения в выбранном в табличном представлении методе делегата

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

и в следующем делегате UINavigationController метод делегата

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...