我有一个在Storyboard中的UITableView,其中包含单元格,并且通过segue将这些单元格与另一个视图连接。
当您选择一个单元格时,它会显示单元格选择动画(在我的情况下是将单元格变为灰色),并将另一个视图推到屏幕上。但是当您返回到tableview时,反选动画根本不会显示(即选择动画的相反作用)。由于我只是使用了segue,所以我希望它能默认处理此问题。
是否有任何方法强制显示反选动画?
我有一个在Storyboard中的UITableView,其中包含单元格,并且通过segue将这些单元格与另一个视图连接。
当您选择一个单元格时,它会显示单元格选择动画(在我的情况下是将单元格变为灰色),并将另一个视图推到屏幕上。但是当您返回到tableview时,反选动画根本不会显示(即选择动画的相反作用)。由于我只是使用了segue,所以我希望它能默认处理此问题。
是否有任何方法强制显示反选动画?
UITableViewController
的子类,并且已将clearsSelectedOnViewWillAppear
设置为YES
(默认值),则会自动处理这个问题。UITableViewController
一样执行此操作。 在-viewWillAppear:
中取消选择所选行。- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
[self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}
UINavigationController
中的 UITableViewController
,该控制器通过 segues 切换到另一个视图控制器。所有组件都是使用 storyboard 进行设置的,并且返回到前一个视图控制器时显示取消选择动画。也许原始视图控制器的视图正在卸载,因此表格的选择状态丢失。这可能会在内存压力较大的情况下发生。 - Mark AdamsUITableViewController
中没有名为clearsSelectedOnViewWillAppear
的属性。你是不是想说 clearsSelectionOnViewWillAppear
? - Pang请确保调用了viewWill...
和viewDid...
方法的super
实现
push
转场时自带的默认返回按钮? - John EstropiaviewDidAppear:
和viewDidDisappear:
上执行NSLog(@"%@", self);
来测试这个问题。 - John Estropia我不确定segue的用法,但我经常想在视图控制器出现时刷新数据。然而,如果您重新加载表格,将清除选择行。这是我使用的一些代码,用于保持选定行并在返回时显示取消选择动画。也许这可以帮助您,所以我会在这里发布它。
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];
[tableView reloadData];
if(indexPath) {
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
}
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
NSIndexPath *indexPath = [tableView indexPathForSelectedRow];
if(indexPath) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
}
针对 Swift 3
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if let path = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: path, animated: true)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
if let path = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(path, animated: true)
}
}
Swift 更新:
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
if tableView.indexPathForSelectedRow != nil {
let indexPath: NSIndexPath = tableView.indexPathForSelectedRow!
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
}