【问题标题】:Apple rejected app because of animationDidStop:finished:context: is a non-public apiApple 拒绝应用程序,因为 animationDidStop:finished:context: 是一个非公共 api
【发布时间】:2010-08-11 05:54:58
【问题描述】:

Apple 拒绝了我的应用,因为:

3.3.1 应用程序只能以 Apple 规定的方式使用文档化 API,不得使用或调用任何私有 API。 应用程序必须最初是用 Objective-C、C、C++ 或 由 iPhone OS WebKit 引擎执行的 JavaScript,只有代码 用 C、C++ 和 Objective-C 编写的可以编译并直接链接 针对已记录的 API(例如,链接到 通过中间翻译或兼容性记录 API 禁止使用图层或工具)。

您的应用程序中包含的非公共 API 是 animationDidStop:finished:context:

这是我使用上述方法调用的方法:

- (void)hideMsg
{

// Slide the view off screen
CGRect frame = self.view.frame;
int retractY;
int retractX;

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.75];

retractY = -190;
retractX = 0;

frame.origin.y = retractY;
frame.origin.x = retractX;
self.view.frame = frame;

//to autorelease the Msg, define stop selector
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

[UIView commitAnimations];

}

我正在使用这种方法在某些事件发生后显示滑动消息。

但是我没有在任何地方定义这个方法。当我试图找到它时,它只在CAAnimation.h,UIView.h中找到。

有人遇到过同样的问题吗?你是怎么解决的?

【问题讨论】:

  • 你说“我没有在任何地方定义这个方法”是什么意思?
  • 我还没有为这个方法写定义。我正在尝试找出可能包含此定义的静态库。

标签: ios objective-c iphone


【解决方案1】:

setAnimationDidStopSelector: 的全部意义在于您告诉系统在动画完成时调用您自己的自定义方法。因此,如果您要传入该选择器,您需要自己在类中定义该方法:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
   // do whatever.
}

注意setAnimationDidStopSelector: 的文档说您必须使用这种形式的选择器,但实际上您也可以使用较短的选择器,例如描述的疯狗。但是,最好获取 animationID 和 context 以及其他项目来检查。

您需要将该方法添加到代码所在的任何类中,因为您将 self 作为动画委托传递。

出于某种原因,他们可能还有一个同名的内部 UIView 方法,这就是为什么您被指责使用未记录的 API。

【讨论】:

  • 邮件还说:“如果您在源代码中定义了与上述 API 同名的方法,我们建议您更改方法名称,使其不再与 Apple 的私有 API 冲突以避免您的申请被标记为未来提交。”那么这里如果我定义的方法里面有我的东西,会不会和苹果的私有api方法冲突呢?
  • 您可以将其命名为 myanimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context 以确保安全(只要接受的参数类型相同,确切名称无关紧要)。不过这很奇怪,因为我在商店的其他应用程序中也使用过相同的方法,可能是刚刚添加的新方法。
  • 如果已经使用了另外两个动画,那么我如何识别这个选择器方法,比如对象上的标签属性。有什么方法可以区分这些动画
  • 这就是上下文的用途。你可以传入一个字符串或其他东西来识别什么是回调。这些天虽然你真的应该只使用块来回调......
【解决方案2】:

如果您需要在动画完成后执行一些操作(例如释放对象),您应该定义自己的方法,然后将选择器传递给 UIView setAnimationDidStopSelector。

例如:

-(无效)messageSlideFinished { // 在这里做一些事情 }

然后在设置动画时你会做

[UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(messageSlideFinished)];

【讨论】:

    【解决方案3】:

    animationDidStopan iOS delegate。您应该为自己的 selector 使用另一个名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 2017-11-25
      • 2017-01-26
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多