【问题标题】:SLComposeViewController dismisses differently for Facebook and Twitter?SLComposeViewController 对 Facebook 和 Twitter 的处理方式不同?
【发布时间】:2012-11-06 09:21:39
【问题描述】:

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

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。我已将问题报告给 Apple (Radar #12642889),目前还没有任何反应。

【问题讨论】:

  • 我也看到了同样的行为。目前,我正在为 Twitter 手动关闭视图控制器,并让系统为 Facebook 执行此操作。
  • 我也注意到了,你有没有回音?
  • 我已向 Apple 提交了一份错误报告,并在 GitHub 上包含了示例项目的链接。大约五周后,Apple 现在才联系我,要求提供一个示例项目(叹气)。我将从 GitHub 下载示例项目,将其添加到问题中并等待。如果有任何变化,我会在这里发布详细信息。
  • 我遇到的症状是twitter完成后,键盘没有自行关闭。像@lucius 提到的那样添加有条件的dismissViewController 来修复它。
  • @zoul,你有收到 Apple 的回复吗?

标签: ios slcomposeviewcontroller


【解决方案1】:

我在我的应用程序中执行了类似的操作,与您的代码的唯一区别是我将 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 上进行了测试。

    【讨论】:

    • 是吗?我现在在 Xcode 5.0.2 中的 iOS 6 中也有同样的问题。用户取消/发布后,我必须手动关闭 Twitter 视图控制器。
    • 应该是。请注意,我说的是 iOS 7,该错误与 Xcode 版本无关。如果您正在使用旧版 iOS 运行当前 Xcode,您可能仍会遇到它。
    • ios9.1+问题依然存在
    【解决方案3】:

    我已确认您对该行为的问题:

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

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

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

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

    这是我解决问题的方法:

    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");}];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多