13

在 iOS 6 中使用客户 UIActivity 子类时,可以指定一个自定义视图控制器,当您从初始 UIActionViewController 的视图中选择您的操作时将显示该控制器。您可以通过从 UIActivity 子类的activityViewController方法返回对自定义视图控制器的引用来执行此操作。

根据UIActivity 类参考

活动视图控制器

此方法的默认实现返回nil. 使用视图控制器提供额外 UI 的子类可以重写此方法以返回该视图控制器。如果此方法返回一个有效对象,系统会为您呈现返回的视图控制器,而不是调用该performActivity方法。在 iPad 上,您的视图控制器显示在弹出框内。在 iPhone 和 iPod touch 上,您的视图控制器以模态方式呈现。

您的自定义视图控制器应该为您的自定义 UI 提供一个视图,并且应该处理这些视图中的任何用户交互。完成活动后,不要自行关闭视图控制器。相反,调用该activityDidFinish:方法并让系统为您解除它。

请注意第一段末尾的那一点:在 iPad 上,您的视图控制器显示在弹出框内。在 iPhone 和 iPod touch 上,您的视图控制器以模态方式呈现。

但是,在 iPad 上activityViewController,无论我如何呈现 UIActivityViewController(模态或通过弹出框),返回的视图控制器总是模态显示。通过弹出框呈现时,它会导致它崩溃,因为它认为它没有被解雇。

我究竟做错了什么?这是 iOS 6 中的错误吗?


更新:这是一个说明问题的简单 Xcode 项目。随意克隆它,看看你是否能看出我们哪里出错了:github.com/simonwhitaker/GSActivityDemo

4

4 回答 4

23

正如我们所说的 UIActivityViewController,它是向用户显示可用活动的视图。苹果声明以下...

您的应用负责配置、呈现和关闭此视图控制器。视图控制器的配置包括指定视图控制器应该操作的数据对象。(您还可以指定您的应用程序支持的自定义服务列表。)当呈现视图控制器时,您必须使用当前设备的适当方式来执行此操作。在 iPad 上,您必须在弹出窗口中显示视图控制器。在 iPhone 和 iPod touch 上,您必须以模态方式呈现。

我把最后一行作为你必须处理视图呈现方式的标志,所以我检查代码是否在 iPad 上运行并相应地使用 UIPopover。正如您可以在这里看到的那样...... https://github.com/bufferapp/buffer-uiactivity/blob/master/BufferUIActivity/Views/FirstViewController.m在以下方法中。

-(IBAction)openUIActivityView:(id)sender {

    NSString *text = @"Hello world";
    NSString *url = @"http://bufferapp.com";


    NSArray *activityItems = @[text, url];

    BufferUIActivity *bufferActivity = [[BufferUIActivity alloc] init];

    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[ bufferActivity ]];


    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self presentViewController:activityView animated:YES completion:^{

        }];
    } else {
        // Change Rect to position Popover
        self.popup = [[UIPopoverController alloc] initWithContentViewController:activityView];
        [self.popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.width/2, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }

}
于 2012-11-20T09:49:28.450 回答
3

我认为活动视图控制器未显示在弹出窗口中的问题是一个错误,文档反映了正确的意图。但是,我不知道解决此 atm 的方法。

然而,关于关闭视图控制器的部分是一个不同的问题。您不应该关闭从返回的视图控制器-[UIActivity activityViewController],但您有责任关闭您呈现的弹出框,这反过来也会从层次结构中删除您的自定义视图控制器。(而且因为它以这种方式工作,我倾向于相信自定义视图控制器通常必须显示在弹出窗口中。)

这是示例应用程序中的代码示例

UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                                 applicationActivities:applicationActivities];

vc.completionHandler = ^(NSString *activityType, BOOL completed){
  [self.activityPopoverController dismissPopoverAnimated:YES];
};
于 2012-11-20T11:32:25.887 回答
1


我在 iOS 7 中遇到了同样的问题。在弹出窗口中显示自定义视图的解决方案是在-(void)performActivity方法中创建并显示它,而不是在-(UIViewController *)activityViewController.

您可以在此链接下的我的问题/答案中看到示例代码:
iOS 7 custom UIActivity as popover

于 2014-05-20T09:47:59.810 回答
-3

我刚刚遇到了同样的问题,但通过将 ViewController 设置为:

[yourViewController setModalPresentationStyle:UIModalPresentationPageSheet];

- (UIViewController *)activityViewController

希望这可以帮助

于 2013-04-16T08:32:34.043 回答