SLComposeViewController在Facebook和Twitter中的dismiss方式不同?

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),但还没有反应。


1
我也看到了相同的行为。目前,我手动关闭Twitter的视图控制器,并让系统关闭Facebook的视图控制器。 - lucius
我也注意到了,你有收到回复吗? - Ser Pounce
我遇到的症状是,在推特完成后,键盘没有自动消失。按照@lucius提到的方法添加条件dismissViewController解决了这个问题。 - Saltymule
@zoul,你从苹果那里听到什么消息了吗? - Jake Lin
@JakeLin,不要说话。 - zoul
显示剩余2条评论
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];

2

显然,在iOS 7中已经修复了这个问题,测试过程在7.0 beta build 11A4449d上进行。


这是吗?我在iOS 6和Xcode 5.0.2中也遇到了同样的问题。在用户取消或发布后,我必须手动关闭Twitter视图控制器。 - anthoprotic
应该注意,我说的是 iOS 7,这个 bug 不依赖于 Xcode 版本。如果你正在使用较旧的 iOS 版本运行当前版本的 Xcode,你仍然可能遇到它。 - zoul
问题在iOS9.1+仍然存在。 - brush51

1
我已确认您的问题和行为相符:
Twitter版本调用您在视图控制器上设置的完成处理程序,并期望您将从此处理程序中调用dismissViewController。
然而,Facebook版本在调用您的完成处理程序之前自己调用了dismissViewController。如果您随后自己调用dismissViewController,则不会发生任何事情,并且不会收到您可能传递给dismissViewController的任何完成块的回调。
如果省略dismissViewController调用,则Twitter共享会卡住,但Facebook可以正常工作。
如果苹果公司打算修复此行为,则很难创建解决方案,因为您的解决方案也可能会受到破坏。主要问题在于同一社交共享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");}];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接