iPhone:UITableView,didSelectRowAtIndexPath多次调用

时间:2012-04-20 15:53:59

标签: iphone

我有UITableView ...当用户点击行时,会打开另一个屏幕。问题是,有时候,我点击一次,但是有几次调用RowRowAtIndexPath。如何防止?

如何重现这种情况的一个案例是(你甚至可以尝试在原生iPhone设置上重现它):

  1. 点按一行但不释放手指
  2. SLIDE从左到右或从右到左的几个下一行(不只是点击,你应该滑动)下一行以不同的顺序用另一只手
  3. 释放手指
  4. 您将看到蓝色选择在多行上,并且将打开的屏幕是随机的

    更新: 在didSelectRow中我刚刚启动了新的控制器,其中viewDidLoad同步开始。 如果要逐步重现我的场景,可以多次启动同步

      - (void)tableView:(UITableView *)tableView 
            didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        SecondViewController *secondViewController =
            [SecondViewController alloc] init];
        [self.navigationController 
            pushViewController:secondViewController animated:YES];
        [secondViewController release];
      }
    

1 个答案:

答案 0 :(得分:1)

是的,我发现了相同的情况。

  1. 点击一行但不释放手指。
  2. 继续按下并轻轻移动手指,直到取消选择行。
  3. 按住第一根手指,然后用另一根手指轻敲屏幕。
  4. 释放所有手指。
  5. 然后你可以看到多次调用didSelectRowAtIndexPath方法。

    我创建了一个用于测试它的新项目,并且只使用了以下代码。它每次都被复制。

    所以我认为这是iOS SDK的错误!

    #import "SPViewController.h"
    
    @interface SPViewController ()
    @property (nonatomic, strong) UITableView *tableView;
    @end
    
    @implementation SPViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
        [self.view addSubview:self.tableView];
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    #pragma mark - UITableViewDataSource
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return 30;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *cellIdentifier = @"cellIdentifier";
        UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if(cell == nil){
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"Test Cell %d", indexPath.row];
        return cell;
    }
    
    #pragma mark - UITableViewDelegate
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return 66;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        NSLog(@"%s %@", __FUNCTION__, indexPath);
    }
    
    @end