1

私はUITableViewを持っています...ユーザーが行をタップすると、別の画面が開きます。問題は、1 回タップすることがありますが、didSelectRowAtIndexPath が数回呼び出すことです。それを防ぐ方法は?

その状況を再現する方法の1つのケースは次のとおりです(ネイティブのiPhone設定で再現することもできます):

  1. 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. 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 に答える