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

Guj*_*min 13 sdk popover ipad ios uiactivity

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

根据UIActivity类参考:

activityViewController

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

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

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

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

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


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

And*_*Dev 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];
    }

}
Run Code Online (Sandbox Code Playgroud)