iPhone UITableView单元保持选中状态

Ste*_*fan 45 iphone cocoa-touch uitableview

在我的UITableView中,有时单元格在触摸后保持选中状态.因为它偶尔发生,我无法重现问题.

任何提示?也许它与tableView的unproper发布有关?

    - (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath{   
    NSUInteger row = [indexPath row];

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

switch (row) {
    case 0:
        FruitViewController *fruitController = [FruitViewController alloc];
        [fruitController retain];
        [fruitController initWithNibName:@"FruitView" bundle:[NSBundle mainBundle]];
        [self.navigationController pushViewController:fruitController animated:YES];
        [fruitController release];
        break;
    case 1: 
        CerealsViewController *cerealsController = [CerealsViewController alloc];
        [cerealsController retain];
        [cerealsController initWithNibName:@"CerealsView" bundle:[NSBundle mainBundle]];
        [self.navigationController pushViewController:cerealsController animated:YES];
        [cerealsController release];
        break;
    default:
        break;   
}
   }
Run Code Online (Sandbox Code Playgroud)

Ed *_*rty 98

我不能告诉你为什么你会看到这个问题,但这里有一些修复它的建议:

根据Apple HIG的说法,选择不应该消失,直到从刚刚推入堆栈的视图控制器返回.如果您的控制器只是一个UITableViewController,它应该在返回视图时自动取消选择.如果没有,请添加

- (void) viewWillAppear:(BOOL)animated {
    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated];
    [super viewWillAppear:animated];
}
Run Code Online (Sandbox Code Playgroud)

在视图控制器中的某个地方.

如果有任何行,当单击时,不要转到另一个视图,并且实际上在选择时不执行任何操作,它们不应该是可选择的,因此您可以在

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

并且nil在不应该选择行的情况下返回.


Fii*_*iid 21

一个可能的原因是覆盖-viewWillAppear:animated:而不调用[super viewWillAppear]扩展的控制器UITableViewController.[super viewWillAppear:animated]-viewWillAppear方法开头添加可能会纠正问题.


Oli*_*ain 11

为了扩展"Ed Marty"的答案,我选择在"viewWillDisappear"方法中添加取消选择,因为我认为它看起来更好.

除此之外,我使用的是带有常规UIViewController的UITableView(而不是UITableViewController),因此我无法使用tableView变量.为了解决这个问题,我在视图控制器头文件中添加了一个tableView属性(在我的XIB文件中,我将实际的表视图连接到属性)...

@property (nonatomic,retain) IBOutlet UITableView *tableView
Run Code Online (Sandbox Code Playgroud)

...并在视图控制器实现中连接属性并执行取消选择,如下所示.

@synthesize tableView

- (void) viewWillDisappear:(BOOL)animated {
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated];
    [super viewWillDisappear:animated];
}
Run Code Online (Sandbox Code Playgroud)


Pac*_*ach 8

如果您使用的是UITableViewController,则可以使用:

self.clearsSelectionOnViewWillAppear = YES;
Run Code Online (Sandbox Code Playgroud)