使用performSelector:withObject:afterDelay:使用非对象参数

时间:2011-03-06 13:21:32

标签: iphone objective-c cocoa

我想稍微延迟在表格视图上调用setEditing:animated:。通常,我会使用performSelector:withObject:afterDelay:

  1. pSwOaD只接受一个参数
  2. setEditing:animated:的第二个参数是原始BOOL - 而不是对象
  3. 过去我会在自己的课堂上创建一个虚拟方法,比如setTableAnimated,然后调用[self performSelector:@selector(setTableAnimated) withObject:nil afterDelay:0.1f,但这对我来说很麻烦。

    有更好的方法吗?

4 个答案:

答案 0 :(得分:19)

为什么不使用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 …];
  });

答案 1 :(得分:16)

您需要使用NSInvocation

请参阅此answer中的代码,我稍微更改了一下以符合您的问题:

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];

答案 2 :(得分:1)

选择器setEditing:animated:performSelector:withObject:afterDelay不兼容。你只能调用带有0或1个参数的方法,参数(如果有的话)必须是一个对象。所以你的解决方法是要走的路。您可以将BOOL值包装在NSValue对象中,并将其传递给setTableAnimated方法。

答案 3 :(得分:0)

如果您可以了解它,请使用NSInvocation抓取器来创建一个调用对象&使用1行而不是多行来调用它:http://overooped.com/post/913725384/nsinvocation