iPhone UITableView单元保持选中状态

时间:2009-05-22 09:32:08

标签: iphone cocoa-touch uitableview

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

任何提示?也许它与tableView的无法正确发布有关?

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

7 个答案:

答案 0 :(得分:98)

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

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

- (void) viewWillAppear:(BOOL)animated {
    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated];
    [super viewWillAppear:animated];
}

视图控制器中的某个地方。

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

中覆盖它们
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

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

答案 1 :(得分:21)

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

答案 2 :(得分:11)

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

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

@property (nonatomic,retain) IBOutlet UITableView *tableView

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

@synthesize tableView

- (void) viewWillDisappear:(BOOL)animated {
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated];
    [super viewWillDisappear:animated];
}

答案 3 :(得分:8)

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

self.clearsSelectionOnViewWillAppear = YES;

答案 4 :(得分:4)

就我而言,我在didSelectRowAtIndexPath末尾取消选择单元格:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // Do smth here. segue ..etc

    [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
}

答案 5 :(得分:0)

UITableViewCell班级

中使用此方法
(void)setSelected:(BOOL)selected animated:(BOOL)animated {

// Just comment This line of code

// [super setSelected:selected animated:animated];

}

甚至可以在didSelectRowAtIndexPath方法中尝试此代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

//选择行时做一些事情

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

答案 6 :(得分:0)

一旦了解了表的管理方式,解决此问题大约需要两秒钟。

一旦单元格在屏幕上滚动,它们就会丢失格式。该表通过关闭其他单元格并在用户向后滚动时重新创建它们来最小化其内存使用量。

甚至像重新加载表数据这样的东西,实际上只适用于当时屏幕上的单元格。重点是,cellForRowAtIndexPath可能会创建相同的单元格五次而无需用户点击按钮或离开视图控制器!因此,将其设置为重新加载任何格式。将这样的内容添加到cellForRowAtIndexPath:

    if arrayOf_SelectedCells.contains(indexPath) {
        setup_Selected(cell)
        //Where setup_Selected is a custom function to apply formatt
    } else {
        setup_Unselected(cell)
    }