18

我有一些看起来像这样的社交分享代码:

SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:…];
[composer setInitialText:…];
[composer addURL:…];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
    [someController dismissViewControllerAnimated:YES completion:^{
        … // 1
    }];
}];
[someController presentModalViewController:composer animated:YES];

问题是 Facebook 和 Twitter 的代码行为不同。当用户确认 Facebook 撰写屏幕时,作曲家显然会自行解散,因为标记为 1 的完成处理程序从未被调用,即使我删除了dismissViewControllerAnimated:调用,一切正常。

另一方面,当用户确认 Twitter 撰写屏幕并且我没有手动关闭它时,撰写屏幕滑出,但应用程序仍然卡住,就像某个控制器仍在前台一样。当我添加dismissViewControllerAnimated:调用时,问题消失了,完成处理程序 (1) 被正确调用。

您是否也注意到了这种行为?难道我做错了什么?这是当前的 iOS 6,GitHub 上的示例代码。我已向 Apple (Radar #12642889) 报告了该问题,但还没有任何反应。

4

3 回答 3

2

我在我的应用程序中做类似的事情,与您的代码的唯一区别是我发送dismissModalViewControllerAnimated:self而不是发送到视图控制器。
facebook 和 twitter 作曲家都滑走了。

这是我的代码:

SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:text];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
    ...
    [self dismissModalViewControllerAnimated:YES];
}];
[self presentModalViewController:composer animated:YES];
于 2012-12-26T23:17:29.753 回答
2

该问题显然已在 iOS 7 中得到解决,并在 7.0 beta build 11A4449d 上进行了测试。

于 2013-08-26T08:44:13.317 回答
1

我已确认您的行为问题:

Twitter 版本调用您在视图控制器上设置的完成处理程序,并期望您将从该处理程序中调用dismissViewController。

然而,Facebook 版本在调用完成处理程序之前调用了 dismissViewController 本身。如果您随后自己调用dismissViewController,则不会发生任何事情,并且您不会从您可能传递给dismissViewController 的任何完成块中获得任何回调。

如果您忽略了dismissViewController 调用,那么Twitter 共享就会卡住,但Facebook 可以工作。

如果 Apple 要修复该行为,那么创建解决方案是一个问题,因为您的解决方案会被破坏。主要问题是同一社交分享VC的微博、Twitter和Facebook分享版本之间的行为不一样。

这是我解决问题的方法:

SLComposeViewController *vc = [SLComposeViewController composeViewControllerForServiceType:serviceType];
if(vc==nil)
{
    [self.delegate imageSaveDidSucceed:NO];
}
else
{
    [vc addImage:self.image];
    vc.completionHandler = ^(SLComposeViewControllerResult result) {
        DEBUG_LOG(@"social sharing completed");
        if(self.presentedViewController)
        {
            DEBUG_LOG(@"presented vc is not nil");
            [self dismissViewControllerAnimated:YES completion:^{
                DEBUG_LOG(@"dismissed vc and calling imageSaveDidSucceed");
                [self.delegate imageSaveDidSucceed:YES];
            }];
        }
        else
        {
            DEBUG_LOG(@"presented vc is nil");
            [self.delegate imageSaveDidSucceed:YES];
        }
    };
    [self presentViewController:vc animated:YES completion: ^{DEBUG_LOG(@"vc was presented");}];
}
于 2013-07-01T19:44:32.827 回答