UITableView在返回时不会保留行

时间:2011-07-11 11:10:56

标签: iphone objective-c uitableview ios4

我的应用中有几个表视图。我熟悉表格的通常行为,当你选择一行并进入推动视图时,它会变为蓝色,然后当你返回时它会保持蓝色一瞬间然后渐变为白色,以便通知用户刚刚选择了什么行。

直到最近,当我注意到它不再是我所描述的最后一点时,它完美地起作用了:它在那一瞬间没有保持蓝色......

我不知道为什么,但在阅读了这个网站上的一些相关帖子后,我意识到执行该操作的代码段是在“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];

}

非常感谢任何帮助,谢谢:)


编辑:已修复

我得到了它....似乎我在我的viewWillAppear方法中调用[self.tableView reloadData]方法,然后导致表取消选择所有单元格。下面是我修改过的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 个答案:

答案 0 :(得分:29)

它可以关闭它。

在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:

答案 1 :(得分:9)

尝试

[tableView deselectRowAtIndexPath:indexPath animated:NO];

用于取消选择行和

[tableView selectRowAtIndexPath:indexPath animated:NO];

用于突出显示所选行。

答案 2 :(得分:2)

显然,UITableView类的viewWillAppear:取消选择所有单元格,即使没有重新加载单元格也是如此。描述的技巧对我有用:

来自我的UITablViewController的代码:

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

    [super viewWillAppear:animated];

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

答案 3 :(得分:1)

在表视图的didSelectRowAtIndexPath委托方法的末尾使用这段代码,

[tableView deselectRowAtIndexPath:indexPath animated:NO];

答案 4 :(得分:0)

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

}

答案 5 :(得分:0)

我不确定这是否相关,但UITableViewController中有一个标志,我刚注意到这个名为

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

我认为这应该可以解决人们在这里描述的一些问题。

答案 6 :(得分:0)

以下代码确实有效

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