SLComposeViewController对Facebook和Twitter的解雇方式有所不同?

时间:2012-11-06 09:21:39

标签: ios slcomposeviewcontroller

我有一些社交分享代码,如下所示:

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,sample code on GitHub。我已向苹果报告此问题(雷达#12642889),尚无反应。

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:2)

这个问题显然在iOS 7中得到修复,在7.0 beta版本11A4449d上进行了测试。

答案 2 :(得分: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");}];
}