Использование executeSelector: withObject: afterDelay: с необъектными параметрами - PullRequest
10 голосов
/ 06 марта 2011

Я хочу вызвать setEditing:animated: в табличном представлении с небольшой задержкой. Обычно я бы использовал performSelector:withObject:afterDelay:, но

  1. pSwOaD принимает только один параметр
  2. вторым параметром setEditing:animated: является примитив BOOL, а не объект

В прошлом я создавал фиктивный метод в своем собственном классе, например setTableAnimated, а затем вызывал [self performSelector:@selector(setTableAnimated) withObject:nil afterDelay:0.1f, но мне это показалось глупым.

Есть ли лучший способ сделать это?

Ответы [ 4 ]

19 голосов
/ 06 марта 2011

Почему бы не использовать dispatch_queue?

  double delayInSeconds = 2.0;
  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
  dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      [tableView setEditing …];
  });
16 голосов
/ 06 марта 2011

Вам нужно использовать NSInvocation:

См. Этот код, взятый из этого ответа , и я немного изменил его, чтобы соответствовать вашему вопросу:

BOOL yes = YES;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self.tableView methodSignatureForSelector:@selector(setEditing:Animated:)]];
[inv setSelector:@selector(setEditing:Animated:)];
[inv setTarget:self.tableView];
[inv setArgument:&yes atIndex:2]; //this is the editing BOOL (0 and 1 are explained in the link above)
[inv setArgument:&yes atIndex:3]; //this is the animated BOOL
[inv performSelector:@selector(invoke) withObject:nil afterDelay:0.1f];
1 голос
/ 06 марта 2011

Селектор setEditing:animated: не совместим с performSelector:withObject:afterDelay.Вы можете вызывать только методы с 0 или 1 аргументом, и аргумент (если есть) ДОЛЖЕН быть объектом.Таким образом, ваш обходной путь - это путь.Вы можете обернуть значение BOOL в объект NSValue и передать его в метод setTableAnimated.

0 голосов
/ 06 марта 2011

Если вы можете обойти это, используйте NSInvocation grabber, чтобы создать объект вызова и вызвать его с задержкой в ​​1 строку вместо многих: http://overooped.com/post/913725384/nsinvocation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...