【问题标题】:iPhone UITableView cells stay selectediPhone UITableView 单元格保持选中状态
【发布时间】:2009-05-22 09:32:08
【问题描述】:

在我的 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;   
}
   }

【问题讨论】:

  • 也许你覆盖 viewWillAppear:animated 而不调用 [super viewWillAppear:animated] ?

标签: iphone cocoa-touch uitableview


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      只是为了扩展“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];
      }
      

      【讨论】:

      • 谢谢,IBOutlet 信息帮助了我。
      • 此解决方案是最好的,因为所选答案在导航控制器中不起作用
      【解决方案4】:

      如果你使用的是 UITableViewController,你可以使用:

      self.clearsSelectionOnViewWillAppear = YES;
      

      【讨论】:

      • 我可以把这个放在哪里?
      • 在您的 viewDidLoad 或 ViewWillAppear @GajendraKChauhan 上试一试
      • @VanDuTran,你是如何实现你的视图控制器的?笔尖,还是故事板?你也可以从 -(void)awakeFromNib 试试吗?因为当你从 xcode 创建一个 master-detail 示例项目时,你会在 awakeFromNib 中看到 Apple 生成的一些代码,'self.clearsSelectionOnViewWillAppear = NO' 所以它应该可以工作。
      • 我使用故事板和 Table View Controller 对象。它生成代码self.clearsSelectionOnViewWillAppear,我改为YES。它在您呈现/关闭视图控制器时起作用.. 但当您点击将您带到另一个应用程序(例如:safari)的单元格然后返回时不起作用。
      • @VanDuTran 然后检查上面的答案,尝试取消选择 didSelectRowatIndexPath 中的行 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 转到 Safari 或其他应用程序[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] 动画:NO]; }
      【解决方案5】:

      在我的情况下,我取消选择 didSelectRowAtIndexPath 末尾的单元格:

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
      
          // Do smth here. segue ..etc
      
          [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO];
      }
      

      【讨论】:

        【解决方案6】:

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

        }

        【讨论】:

          【解决方案7】:

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

          一旦单元格滚动到屏幕外,它们就会失去格式。该表格通过关闭其他单元格并在用户向后滚动时重新创建它们来最大限度地减少内存使用量。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-13
            • 2023-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多