UIActivity activityViewController不会在iPad上解散

时间:2012-09-22 12:04:34

标签: 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;
}

我添加了一个完整的repro on GitHub


根据文档,您不应该手动解雇。相反,操作系统会在您调用activityDidFinish:时执行此操作。这在iPhone上运行时效果很好。

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

  1. 显示UIActivityViewController
  2. 用户按我的自定义活动
  3. 我的视图控制器出现
  4. 我致电activityDidFinish:
  5. 我的自定义视图控制器已被关闭
  6. UIActivityViewController也被驳回
  7. 然而,当我在iPad模拟器上运行相同的代码时 - 唯一的区别是我将UIActivityViewController放在弹出窗口中,正如文档所说的那样 - activityViewController永远不会解散

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

    我发现这个雷达谈论same problem in iOS6 beta 3,但似乎这样的基本功能我怀疑我的代码而不是操作系统中的错误(还要注意它与Twitter和Facebook功能正常工作!)。< / p>


    我错过了什么吗?当它在UIPopoverViewController中运行时,我是否需要在activityViewController中做一些特殊的事情? iPad上的“流”假设是不同的吗?

8 个答案:

答案 0 :(得分:7)

自动解雇只会在您的“活动”控制器直接呈现时出现,而不会包含在任何内容中。所以在显示弹出窗口之前,添加一个完成处理程序

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

你会很好。

答案 1 :(得分:4)

我看到这个问题很老了,但我们一直在调试相同的视图 - 控制器 - 不解决问题,我希望我的答案会提供一些额外的细节和更好的解决方案,而不是调用-dismissPopoverAnimated:手动

关于UIActivity的文档非常稀少,虽然它暗示了应该构建一个实现的方式,但问题显示它并不是那么明显。

您应该注意的第一件事是文档说明您无论如何都要手动解雇视图控制器。这实际上是正确的。

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

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

进一步略读UIActivity文档,可能会遇到-prepareWithActivityItems:方法。具体提示如下:

  

如果服务的实现需要向用户显示其他UI,则可以使用此方法准备视图控制器对象,并使其从activityViewController方法中可用。

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

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

宾果

NB!进一步深入研究,-prepareWithActivityItems:每次调用时都应 实例化一个新的视图控制器。如果您以前创建了一个,则应该只重复使用它。在我们的例子中,如果我们不这样做,它会很快崩溃。

我希望这有助于某人。 :)

答案 2 :(得分:2)

我遇到了同样的问题。它解决了我将activityViewController保存为成员并返回存储的控制器。 Activity返回新对象,并在新对象上调用dismiss。

    - (UIViewController *)activityViewController {
        if (!self.detaisController) {
            // create detailsController
        }
        return self.detailsController;
    }

答案 3 :(得分:1)

我将UIActivity传递给另一个视图,然后调用以下内容......

[myActivity activityDidFinish:YES];

这适用于我的设备以及模拟器。确保您没有像我之前那样覆盖UIActivity .m文件中的activityDidFinish方法。您可以看到我正在使用的代码here

答案 4 :(得分:1)

解决方法是要求调用ViewController通过- (void)performActivity对目标ViewController执行segue,尽管Apple不建议这样做。

例如:

- (void)performActivity
{

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        [self.delegate performSomething]; // (delegate is the calling VC)
        [self activityDidFinish: YES];
    }
}

- (UIViewController *)activityViewController
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        UIViewController* vc=XXX;

        return vc;
    }
    else
    {
        return nil;
    }
}

答案 5 :(得分:0)

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

希望它有所帮助!

答案 6 :(得分:0)

所以我有同样的问题,我有自定义的活动ViewController定制UIActivity,当它以模态方式呈现时,它不会忽略我尝试的不重要。我选择使用的工作是为了让用户保持相同的体验仍然是使用自定义UIActivity,但是将该活动作为委托。所以在我的UIActiviy子类中,我有以下内容:

- (void)performActivity
{
    if ([self.delegate respondsToSelector:@selector(showViewController)]) {
        [self.delegate showViewController];    
    }

    [self activityDidFinish:YES];
}

- (UIViewController *)activityViewController
{
    return nil;
}

然后我创建了显示UIActivityViewController委托的视图控制器,它显示了您将在委托方法的activityViewController中显示的视图控制器。

答案 7 :(得分:-1)

最后发布怎么样?使用非弧项目!

<强> [progressView release];

许多用户遇到与您相同的问题!另一种解决方案是:

UIActivityIndicatorView *progress= [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)];
progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
[alert addSubview:progress];
[progress startAnimating];

如果您正在使用故事板,请确保在您点击activityind时。单击“隐藏时隐藏”!

希望有帮助...