1

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

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

  1. 点击一行但不要松开手指
  2. 用另一只手以不同的顺序从左到右或从右到左滑动下几行(不仅仅是点击,你应该滑动)下几行
  3. 松开手指

你会看到蓝色的选择在几行上,打开的屏幕是随机的

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

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

1 回答 1

1

是的,我发现同样的情况。

  1. 点击一行但不要松开手指。
  2. 继续按住并轻轻移动手指,直到取消选择该行。
  3. 按住第一根手指,然后用另一根手指点击屏幕几次。
  4. 松开所有手指。

然后你可以看到 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
于 2013-01-10T07:55:11.537 回答