9

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

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

    return progressView;
}

在 GitHub 上添加了一个完整的复制品。


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

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

  1. 显示UIActivityViewController
  2. 用户按下我的自定义活动
  3. 我的视图控制器出现
  4. 我打电话activityDidFinish:
  5. 我的自定义视图控制器被解雇
  6. UIActivityViewController也被解雇了

UIActivityViewController然而,当我在 iPad 模拟器上运行相同的代码时——唯一的区别是我activityViewController

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

我发现这个雷达在beta 3中讨论了同样的问题iOS6,但它似乎是这样的基本功能,以至于我怀疑我的代码而不是操作系统中存在错误(另请注意,它与 Twitter 和 Facebook 功能一起正常工作!)。


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

4

8 回答 8

8

仅当您的“活动”控制器直接呈现,而不是包裹在任何东西中时,才会出现自动解雇。因此,在显示它所包含的弹出窗口之前,添加一个完成处理程序

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

你会好起来的。

于 2012-10-03T01:15:20.373 回答
4

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

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

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

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

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

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

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

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

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

答对了。

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

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

于 2013-06-06T12:19:37.703 回答
2

我有同样的问题。它为我解决了将 activityViewController 保存为成员并返回存储的控制器的问题。活动返回新对象并在新对象上调用解除。

    - (UIViewController *)activityViewController {
        if (!self.detaisController) {
            // create detailsController
        }
        return self.detailsController;
    }
于 2013-05-30T14:55:27.803 回答
1

我通过 UIActivity 到另一个视图然后调用以下...

[myActivity activityDidFinish:YES];

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

于 2012-09-27T12:39:43.900 回答
1

一种解决方法是要求调用 ViewController 通过执行对目标 ViewController 的 segue,- (void)performActivity尽管 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;
    }
}
于 2013-04-17T08:54:40.373 回答
0

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

希望能帮助到你!

于 2012-09-22T12:42:10.097 回答
0

所以我遇到了同样的问题,我有一个带有自定义 activityViewController 的自定义 UIActivity,当它以模态方式呈现时,无论我尝试什么都不会关闭。为了使用户的体验保持不变,我选择使用的解决方法是仍然使用自定义 UIActivity,但给该活动一个委托。所以在我的 UIActiviy 子类中,我有以下内容:

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

    [self activityDidFinish:YES];
}

- (UIViewController *)activityViewController
{
    return nil;
}

然后,我将显示 UIActivityViewController 的视图控制器设为委托,并显示视图控制器,否则您将在委托方法中的 activityViewController 中显示该视图控制器。

于 2014-01-29T19:14:56.533 回答
-1

最后释放呢?使用非圆弧项目!

[progressView release];

许多用户和你有同样的问题!另一种解决方案是:

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

如果您使用情节提要,请确保当您单击活动时。单击“停止时隐藏”!

希望有帮助...

于 2012-10-02T22:33:14.393 回答