我有一些社交分享代码,看起来像这样:
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的compose屏幕时,作曲者显然对自己不屑一顾,因为标记为1的完成处理程序永远不会被调用,即使当我删除dismissViewControllerAnimated:
调用时,一切都正常工作。
另一方面,当用户确认Twitter compose screen时,我没有手动忽略它,compose screen会滑出,但应用程序会停留在原处,就像一些控制器仍然在前台一样。当我添加dismissViewControllerAnimated:
调用时,问题消失了,并且正确调用了完成处理程序(1)。
你也注意到这个行为了吗?我做错了什么吗?这是当前的iOS 6,sample code on GitHub。我已经向苹果报告了这个问题(雷达#12642889),目前还没有反应。
发布于 2013-08-26 16:44:13
该问题显然已在iOS 7中修复,在7.0 beta build 11A4449d上进行了测试。
发布于 2012-12-27 07:17:30
我在我的应用程序中做了类似的事情,与您的代码唯一的区别是我将dismissModalViewControllerAnimated:
发送到self
,而不是发送到视图控制器。
facebook和twitter composer都在悄悄溜走。
这是我的代码:
SLComposeViewController *composer = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
[composer setInitialText:text];
[composer setCompletionHandler:^(SLComposeViewControllerResult result) {
...
[self dismissModalViewControllerAnimated:YES];
}];
[self presentModalViewController:composer animated:YES];
发布于 2013-07-02 03:44:33
我已经确认了你的行为问题:
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");}];
}
https://stackoverflow.com/questions/13247960
复制相似问题