【问题标题】:Iphone - how to pass a parameter to animationDidStop?Iphone - 如何将参数传递给animationDidStop?
【发布时间】:2010-02-19 15:20:56
【问题描述】:

我有这个方法……

- (void) helloThere: (int) myValue {

  // I am trying to pass myValue to animationDidStop
  [UIView beginAnimations:nil context:[NSNumber numberWithInt: myValue]];
  [UIView setAnimationDuration:1.0];
  [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
  [UIView setAnimationDelegate:self];

  // do stuff

  [UIView commitAnimations];
}

然后我正在尝试在 animationDidStop 上检索 myValue...

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {

  int retrievedValue = (int)context; //??? not giving me the right number

}

但 retrievedValue 给了我一个与原始 myValue 无关的数字...

如何找回那个号码?

感谢您的帮助。

【问题讨论】:

    标签: iphone iphone-sdk-3.0


    【解决方案1】:

    请参阅@DyingCactus's answer了解如何获取整数。

    然而,OP 的代码在上下文上有一个严重的问题。由于上下文的类型是void*,UIKit 不会期望您将 ObjC 对象传递给它,因此不会保留 NSNumber。

    因此,当你执行时

    [(NSNumber*)context intValue];
    

    在 animationDidStop 中几乎可以肯定你会得到一些疯狂的数字或崩溃。

    有两种类似的方法可以解决这个问题。

    (a) 传递retain count为+1的对象,并在animationDidStop中释放:

    [UIView beginAnimations:nil context:[[NSNumber alloc] initWithInt:myValue]];
    ....
    int retrievedValue = [(NSNumber*)context intValue];
    [(NSNumber*)context release];
    

    (b) 传递一个malloc-ed 内存,并在animationDidStop 中free 它:

    int* c = malloc(sizeof(*c));
    *c = myValue;
    [UIView beginAnimations:nil context:c];
    ....
    int retrievedValue = *(int*)context;
    free(context);
    

    【讨论】:

    • 感谢您提供更多信息。
    • 只是好奇:我在文档中没有看到名为 animationDidStop:finished:context: 的选择器。我看到animationDidStop:finished:选择器,但它的签名不同,其中动画是CAAnimation,finished是BOOL - 问题中的那个传递一个NSString作为动画ID,一个数字表示完成,一个void *表示上下文.我在文档中遗漏了什么吗??
    • 哦,我明白了。我在看错误的方法。我看到的是在 NSObject 上,而我正在寻找的是在 UIView 上。谢谢。
    • 觉得我一直都做错了...见:stackoverflow.com/questions/2297752/…
    • 如果您使用 ARC,请不要忘记添加 __bridge cast。 [UIView beginAnimations:@"ResizeForKeyboard" context:(__bridge void *)@"test"]; 并在处理程序中:[(__bridge NSString *)context isEqualToString:@"test"]
    【解决方案2】:

    你将一个 NSNumber 放在上下文中,所以像这样检索它:

    int retrievedValue = [(NSNumber *)context intValue];
    

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2012-12-21
      • 2012-01-07
      • 2014-05-03
      • 2015-06-26
      • 2012-01-18
      • 2017-07-14
      • 2018-03-08
      • 2020-09-01
      相关资源
      最近更新 更多