2013-07-12 4 views
4

У меня есть uitableview, который реализует popover (PopoverView), когда ячейка прослушивается, а затем popover будет отключаться на любом другом крачке на экране. Проблема заключается в том, что если пользователь дважды будет кратковременно нажимать или нажимать на ячейку, это вызовет появление нескольких экземпляров popoverviews, а затем приложение сработает. Я ищу способ отключить двойное нажатие на ячейку и/или UITableView вообще ИЛИ есть способ отложить касания на UITableViewCell каких-либо идей?Отключить множественные ответвления на uitableviewcell

Я уже пробовал this, но это не работает в моем случае. Другой подход состоял бы в том, чтобы проверить, присутствует ли PopoverView, если это так, то не позволяйте другому создавать экземпляр. Я пробовал this и this, и оба не работают в моем случае.

Вот мой код, где я называю вид поповер на didSelectRowAtIndexpath:

- (void)tableView:(UITableView *)TableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [TableView cellForRowAtIndexPath:indexPath]; 
sti = [[SelectedTeamsInfo alloc] init]; 
MyLeagueStandings *info = [fetchedResultsController objectAtIndexPath:indexPath]; 
[sti getAllScheduleForTeam:info.urlforteam]; 
NSString *title = info.teamname; 

// If title length is greater then 32 truncate it to fit. 
if (title.length > 32) { 
    title = [info.teamname substringToIndex:29]; 
    title = [title stringByAppendingString:@"..."]; 
} 


[PopoverView showPopoverAtPoint:cell.center inView:self.view withTitle:title withContentView:sti.view delegate:self]; 
} 

РЕШЕНИЕ:

В классе интерфейса:

BOOL PopoverYN; 

В классе реализации:

- (void)tableView:(UITableView *)TableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     // If the popover is not available then display it else do nothing since one is already displayed. 
     if (PopoverYN == NO) { 
      PopoverYN = YES; 
      UITableViewCell *cell = [TableView cellForRowAtIndexPath:indexPath]; 
      sti = [[SelectedTeamsInfo alloc] init]; 
      MyLeagueStandings *info = [fetchedResultsController objectAtIndexPath:indexPath]; 
      [sti getAllScheduleForTeam:info.urlforteam]; 
      NSString *title = info.teamname; 

      // If title length is greater then 32 truncate it to fit. 
      if (title.length > 32) { 
       title = [info.teamname substringToIndex:29]; 
       title = [title stringByAppendingString:@"..."]; 
      } 
      [PopoverView showPopoverAtPoint:cell.center inView:self.view withTitle:title withContentView:sti.view delegate:self]; 
     } 

} 

#pragma mark - popover methods. 
- (void)popoverViewDidDismiss:(PopoverView *)popoverView; 
{ 
    PopoverYN = NO; 
} 
+1

Это один из тех вопросов, на которые у меня возникают проблемы, потому что у меня так много ответов. вам нужно будет указать переменную, которую вызывает ваш popover, и игнорировать что-либо еще, пока вы не вернетесь. в основном, обертывание того, что находится в вашем методе didselectrowatIndexPath внутри оператора if, который проверяет BOOL, который вы сбросите, когда представление вернется. – rezand

+0

Ваш комментарий был также очень полезен. – sudo

+0

Рад это здесь и спасибо за отзыв. – rezand

ответ

0

Прикрепите popover к собственности на этом виде. Очистите это, когда оно отклонено (через метод делегата). В didSelectRowAtIndexPath не создавайте другого popover, если первый не был уволен.

+0

Прекрасное спасибо! Метод и свойство делегата - вот что сделал трюк. – sudo

3

У меня есть еще одно решение. Надеюсь, это поможет кому-то. Если вы хотите обнаружить второй кран и потреблять его, то это все, это сработало для меня. Я загружал веб-представление на одном кране, если есть два последовательных ответвления, ошибка получала событие NSURLErrorCancelled и вызывала белый экран вспышки на webview. Я мог бы справиться с этим на уровне веб-представления, но я, хотя я должен убить проблему при корне.

NSTimer *avoidDoubleTapTimer; 

- (void) onTimer { 
    NSLog(@"Timer out"); 
    avoidDoubleTapTimer = nil; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(avoidDoubleTapTimer == nil) { 
     avoidDoubleTapTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 
    } else { 
     NSLog(@"Double Tap Detected"); 
     return; 
    } 
// do you stuff on single tap 
} 
Смежные вопросы