我有一些社交分享代码,如下所示:
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),尚无反应。
答案 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");}];
}