Использование performSelector: withObject: afterDelay: с параметрами без объекта
Я хочу вызвать setEditing:animated:
в виде таблицы с небольшой задержкой. Обычно я использовал бы performSelector:withObject:afterDelay:
, но
- pSwOaD принимает только один параметр
- второй параметр
setEditing:animated:
- это примитивный BOOL - не объект
В прошлом я создавал бы фиктивный метод в своем классе, например setTableAnimated
, а затем вызывал [self performSelector:@selector(setTableAnimated) withObject:nil afterDelay:0.1f
, но для меня это было неприятно.
Есть ли лучший способ сделать это?
Ответы
Ответ 1
Почему бы не использовать 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 …];
});
Ответ 2
Вам нужно использовать 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];
Ответ 3
Селектор setEditing:animated:
не совместим с performSelector:withObject:afterDelay
. Вы можете вызывать только методы с 0 или 1 аргументами, а аргумент (если есть) ДОЛЖЕН быть объектом. Таким образом, ваше решение - путь. Вы можете обернуть значение BOOL в объект NSValue
и передать его вашему методу setTableAnimated
.
Ответ 4
Если вы можете обойти его, используйте захват NSInvocation для создания объекта вызова и вызовите его с задержкой с 1 строкой вместо многих: http://overooped.com/post/913725384/nsinvocation