UIActivity activityViewController在iPad上以模态方式呈现,而不是在popover中呈现

时间:2012-11-17 18:56:17

标签: ios ipad sdk popover uiactivity

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

根据UIActivity class reference

  

activityViewController

     

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

     

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

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

然而,在iPad上,activityViewController返回的视图控制器总是以模态方式显示,无论我如何呈现UIActivityViewController(无论是模态还是通过弹出窗口)。当通过弹出窗口呈现时,它会导致崩溃,因为它不认为它被解雇了。

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


更新:这是一个简单的Xcode项目,用于说明问题。随意克隆它并四处玩,看看你是否能看到我们出错的地方:github.com/simonwhitaker/GSActivityDemo

4 个答案:

答案 0 :(得分:23)

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

  

您的应用负责配置,展示和解除此视图控制器。视图控制器的配置涉及指定视图控制器应该在其上操作的数据对象。 (您还可以指定应用程序支持的自定义服务列表。)在呈现视图控制器时,必须使用适当的方法为当前设备执行此操作。在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];
    }

}

答案 1 :(得分:3)

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

然而,关于解除视图控制器的部分是另一个问题。您不应该忽略从-[UIActivity activityViewController]返回的视图控制器,但是负责解除您提供的弹出框,这反过来也将从中移除您的自定义视图控制器层次结构。 (因为它以这种方式工作,我倾向于认为自定义视图控制器通常必须在弹出框中显示。)

以下是your example app:

代码的示例
UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                                 applicationActivities:applicationActivities];

vc.completionHandler = ^(NSString *activityType, BOOL completed){
  [self.activityPopoverController dismissPopoverAnimated:YES];
};

答案 2 :(得分:1)


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

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

答案 3 :(得分:-3)

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

来解决它
[yourViewController setModalPresentationStyle:UIModalPresentationPageSheet];

- (UIViewController *)activityViewController

希望这会有所帮助