2012-04-20 4 views
1

У меня есть UITableView ... когда пользователь нажимает на строку, открывается другой экран. Проблема в том, что иногда я один раз нажимаю, но didSelectRowAtIndexPath вызывает несколько раз. Как это предотвратить?iPhone: UITableView, didSelectRowAtIndexPath вызывается несколько раз

Один случая как воспроизвести эту ситуацию это (вы можете даже попытаться воспроизвести, что на родные настройках iPhone):

  1. Нажмите на одну строку, но не отпускаете палец
  2. слайда несколько следующих строк слева направо или справа налево (не просто нажмите, вы должны скользить) следующие несколько строк в другом порядке другой стороны
  3. палец Выпуск

вы увидите, что синий выбор на разъединять al rows, и какой экран будет открыт, является случайным

UPDATE: В didSelectRow Я только что начал новый контроллер, где в режиме viewDidLoad начинается синхронизация. И если воспроизвести мой шаг за шагом сценария, чем синхронизация может быть запущено несколько раз

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

'' didSelectRowAtIndexPath'' не будет вызываться, если вы не отпустите палец. Есть еще один делегат '' willSelectRowAtIndexPath'', который вызывается перед ним. Эти делегаты неоднократно называются. Возможно, вы захотите опубликовать некоторый код, чтобы описать вашу проблему. Я считаю, что вы ошиблись в коде. –

+0

Вы правы, didSelectRowAtIndexPath не будет вызываться, если я не отпущу палец, но когда я отпираю палец, он вызывает несколько раз. Ничего особенного в этом методе. Я добавлю обновления через минуту – Jim

ответ

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 
+6

это не решение –

Смежные вопросы