UIActivity activityViewController不会在iPad上解散

Ste*_*ton 9 ipad ios6 uiactivity

我有一个UIActivity创建自己的子类activityViewController:

- (UIViewController *)activityViewController {
    WSLInProgressViewController* progressView = [[[WSLInProgressViewController alloc] init] autorelease];
    progressView.message = [NSString stringWithFormat:NSLocalizedString(@"Posting to %@...",@"Posting to..."),
                        self.activityType];

    return progressView;
}
Run Code Online (Sandbox Code Playgroud)

在GitHub上添加了一个完整的repro.


根据文档,您不应该手动解雇.相反,操作系统会在您打电话时执行此操作activityDidFinish:.这在iPhone上运行时工作正常.

当我说"工作"时,这是我期待的事件序列(并在iPhone上看到):

  1. 显示 UIActivityViewController
  2. 用户按下我的自定义活动
  3. 我的视图控制器出现
  4. 我打电话 activityDidFinish:
  5. 我的自定义视图控制器被关闭
  6. UIActivityViewController还驳回

但是,当我在iPad模拟器上运行相同的代码时 - 唯一的区别是我把它UIActivityViewController放在弹出窗口中,正如文档所说的那样 - activityViewController永远不会解散.

正如我所说,这是代码wo/popUP在iPhone上工作,我已经逐步完成了代码,所以我知道它activityDidFinish:正在被调用.

我发现这个雷达iOS6beta 3中讨论了相同的问题,但它似乎是我怀疑我的代码而不是操作系统中的错误的基本功能(也注意它与Twitter和Facebook功能正常工作!).


我错过了什么吗?当activityViewController运行时,我是否需要在activityViewController中做一些特别的事情UIPopoverViewController?iPad上的"流量" 应该是不同的吗?

Ale*_*ylo 7

仅当您的"活动"控制器被直接呈现而不包含在任何内容中时,才会发生自动解雇.所以在显示它包含的弹出窗口之前,添加一个完成处理程序

activity.completionHandler = ^(NSString *activityType, BOOL completed){
   [self.popup dismissPopoverAnimated:YES];
};
Run Code Online (Sandbox Code Playgroud)

你会好的.


epl*_*oko 5

我发现这个问题已经很老了,但是我们一直在这里调试相同的视图控制器不关闭问题,我希望我的答案能够提供一些额外的细节和比手动调用更好的解决方案-dismissPopoverAnimated:

关于 UIActivity 的文档非常稀疏,虽然它暗示了实现的结构方式,但问题表明它并不那么明显。

您应该注意的第一件事是文档指出您不应该任何方式手动关闭视图控制器。这实际上是正确的。

文档中没有提到的,以及当您在调试非解除视图控制器问题时可以观察到的事情是,iOS在需要对主题视图控制器的引用时调用您的方法。-activityViewController事实证明,可能仅在 iPad 上,iOS 实际上并不将返回的视图控制器实例存储在其结构中的任何位置,然后,当它想要关闭视图控制器时,它只是向您询问该-activityViewController对象,然后将其关闭。因此,在第一次调用该方法时实例化的视图控制器(当它显示时)永远不会被忽略。哎哟。这就是问题的原因。

我们如何正确解决这个问题?

进一步浏览UIActivity文档可能会偶然发现该-prepareWithActivityItems:方法。具体提示位于以下文本中:

如果您的服务的实现需要向用户显示额外的 UI,您可以使用此方法来准备视图控制器对象并使其可通过 ActivityViewController 方法使用。

因此,我们的想法是在方法中实例化视图控制器-prepareWithActivityItems:并将其处理到实例变量中。然后只需从您的方法返回相同的实例即可-activityViewController

鉴于此,在调用该-activityDidFinish:方法后,视图控制器将被正确隐藏,无需任何进一步的手动干预。

答对了。

注意!进一步挖掘这一点,-prepareWithActivityItems:应该在每次调用时实例化一个新的视图控制器。如果您以前创建过一个,则只需重复使用它即可。在我们的例子中,如果我们不这样做,它就会很高兴地崩溃。

我希望这可以帮助别人。:)


The*_*ter 0

你使用故事板吗?也许在您的 iPad 故事板中,UIActivityIndicatorView没有选中“停止时隐藏”?

希望能帮助到你!