IPhone--如何向AnimationDidStop传递参数?

人气:572 发布:2022-10-16 标签: iphone iphone-sdk-3.0

问题描述

我有这个方法...

- (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

}

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

如何检索该号码?

谢谢您的帮助。

推荐答案

有关如何获取整数的信息,请参阅@DyingCactus的答案。

然而,

op的代码在上下文中有一个严重的问题。由于上下文类型为void*,因此UIKit不会期望您向其传递Objc对象,因此不会保留NSNnumber。

因此,当您执行

[(NSNumber*)context intValue];

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

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

(A)传递保留计数为+1的对象,并在AnimationDidStop:

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

(B)传递malloc内存,free在AnimationDidStop:

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

438