UIActivityViewController,活动未完成,共享选项未加载

Posted

技术标签:

【中文标题】UIActivityViewController,活动未完成,共享选项未加载【英文标题】:UIActivityViewController, activities not being completed, sharing options not loading 【发布时间】:2014-01-28 00:08:55 【问题描述】:

我有一个带有分享按钮的应用。这个分享按钮加载一个 UIActivityViewController 用于分享到 Facebook、Twitter、电子邮件、短信等。

它以前可以正常工作,我认为它在模拟器上仍然可以正常工作,但是在设备上,视图控制器会显示所有正确的选项,如果你点击一个,要么什么都没有发生,或者如果它是邮件,邮件模式视图加载然后自行关闭。然后我得到我的日志“未执行活动。”,这是当完成块返回 false 完成但 activityType 不为空时。所以它正在识别选择,但由于某种原因它没有将活动加载到视图中

我已经检查了我要分享的内容,甚至将其替换为虚拟内容(如下所示),但仍然没有运气。我使用的是普通设备,我设置了 Twitter、Mail 和 Facebook 帐户,发短信也可以。唯一有效的是复制(即当您将共享内容复制到剪贴板时)。在同一设备上的其他应用程序中,UIActivityViewController 和所选活动的加载工作得很好。在运行该应用的其他设备上也发现了同样的问题。

真的不明白这里的问题是什么。非常令人困惑!任何尝试的帮助或建议将不胜感激。我没有看到任何调试此问题的方法。

这是代码:(注意我也尝试删除图像,没有运气)

- (void)shareTapped 

    NSString *shareText = @"Testing";//[self shareText];

    NSURL *url = [NSURL URLWithString:@"http://www.google.ca"]; //[self shareURL];
    NSArray *activityItems = [NSArray arrayWithObjects:shareText,url, self.shareImage, nil];

    UIActivityViewController *shareDrawer = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
shareDrawer.excludedActivityTypes = @[UIActivityTypePostToWeibo,UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll,UIActivityTypePrint];

    shareDrawer.completionHandler = ^(NSString *activityType, BOOL completed) 
        if (completed) 
            NSLog(@"Selected activity was performed.");
         else 
            if (activityType == NULL) 
                NSLog(@"User dismissed the view controller without making a selection.");
             else 
                NSLog(@"Activity was not performed.");
            
        

        NSString *result = completed ? @"success" : @"fail";
        if (activityType == NULL) 
            result = @"dismissed";
        
    ;
    [self presentViewController:shareDrawer animated:YES completion:nil];

【问题讨论】:

您是否尝试过在数组中的对象上实现 UIActivityItemSource 协议而不是将数据作为单独的元素添加到数组中?不确定它是否真的对您的情况有所不同,因为听起来它在呈现视图时失败了,但我想它值得一试来改变数据的馈送方式。 我将几乎完全相同的代码放入我正在开发的一个不同的、更简单的应用程序中,它运行良好......我的应用程序中可能会出现什么问题? 还尝试将 UIActivityViewController 放在我的问题应用程序的另一个视图控制器中,但它不起作用。 我尝试添加一个空白视图控制器,其中只有一个共享按钮,它会触发 UIActivityViewController,它工作正常,所以我的视图控制器中一定有一些冲突...... 我还注意到活动视图控制器的奇怪行为,所以我不怀疑您遇到了一些无法轻易解释的怪癖。也缺乏关于它的文档,有点让我陷入了一段时间的循环。很高兴您找到了解决方案! 【参考方案1】:

好的,通过排除的过程我终于找到了罪魁祸首:

我有一个自定义 UISegmentedControl 和自定义文本字体,我手动调整了内容偏移量以使其正确显示。虽然我已经删除了这些行并且分段控件实际上看起来很好。

这是代码(我已经确认是所有三行代码都导致了问题)

    [[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(4, 0) forSegmentType:UISegmentedControlSegmentLeft barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(0, 0) forSegmentType:UISegmentedControlSegmentCenter barMetrics:UIBarMetricsDefault];
    [[UISegmentedControl appearance] setContentPositionAdjustment:UIOffsetMake(-4, 0) forSegmentType:UISegmentedControlSegmentRight barMetrics:UIBarMetricsDefault];

现在,看到在您选择共享选项后弹出的视图中没有分段控件,我不知道为什么会导致这个问题。但现在我删除它后它确实有效。

感谢那些试图提供帮助的人。当然,你不可能猜到这是问题所在。任何人一开始就会遇到这个问题的可能性非常低,因为调整内容位置可能相当罕见。

为了调试这个问题,我按照以下步骤操作:

    我测试了问题是否与我正在设置的 UIActivityViewController 上的属性或我正在共享的活动项有关。它没有。 我测试了当从我的应用程序内的不同视图控制器调用时 UIActivityViewController 是否正常工作。它没有。 我制作了一个带有按钮的空白视图控制器,该按钮会导致通用 UIActivityViewController 在按下条形按钮时显示。我把它作为我的根视图。这很有效,因此表明这是一个孤立的问题。 我没有将该视图控制器设置为我的应用程序的根,而是从我的正常主视图中推送它。它不再起作用,因此确定问题可能与我的主要观点有关。 我注释掉了 viewDidLoad、viewDidAppear 和 viewWillAppear 中的所有代码,除了向导航栏添加一个按钮以加载我的共享测试。那行得通。然后我取消注释 viweDidAppear 和 viewWillAppear,仍然有效。所以我取消了对 viewDidLoad 块的注释,直到我弄清楚问题出在哪里。

我学到了什么:对于像这样的奇怪问题(即那些看起来像 ios 错误或其他东西的问题,但你找不到任何人发布它),你应该在尝试发布堆栈溢出之前花更多时间进行调试。 (我现在应该真的知道这一点了,但要调试的每个新问题都感觉像是这条规则的例外)

如果您知道为什么调整 UISegmentedControl 的内容位置会扰乱 UIActivityViewController 的共享,请在下面评论,即使这些视图不包含分段控件

谢谢

【讨论】:

【参考方案2】:

也遇到了同样的问题,这是我为克服它所做的。

我建议将 Social.framework 添加到您的链接二进制文件中并使用

SLComposeViewController *socialShare = [SLComposeViewController composeViewControllerForServiceType:shareType];

其中 shareType 可以是 SLServiceTypeFacebookSLServiceTypeTwitter

我创建了一个 UIAlertview 弹出窗口来显示用户的共享选项

    UIAlertView *social = [[UIAlertView alloc]initWithTitle:@"Share" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Twitter", @"Facebook", @"Email", nil];

根据他们选择的内容(使用 UIAlertview Delegate 方法),可以相应地共享内容,这是 UIActivityViewController 的绝佳替代品。

希望这个建议能有所帮助,干杯,吉姆。

【讨论】:

谢谢,但不是真正的解决方案。另外,我不想将其仅限于 Facebook 和 Twitter。 我明白,它比较有限,但对于寻找 FB、Twitter 或电子邮件(电子邮件不是 SLC,但可以轻松添加为警报视图的选项)的人来说,我希望这是一个不错的选择。希望你设法把它整理好。干杯 甚至没有尝试解决问题,也没有要求替代方案;要求尝试(即解决问题)。

以上是关于UIActivityViewController,活动未完成,共享选项未加载的主要内容,如果未能解决你的问题,请参考以下文章

UIActivityViewController 背景颜色

UIActivityViewController 共享 UIActivity 未显示

UIActivityViewController 不适用于 WKWebView

限制 UIActivityViewController 共享扩展活动

尝试呈现 UIActivityViewController 时崩溃

更改 UIActivityViewController 的 navigationBar 的颜色