在iOS 6中使用客户UIActivity子类时,可以指定从初始UIActionViewController视图中选择操作时显示的自定义视图控制器。您可以通过从UIActivity子类的activityViewController
方法返回对自定义视图控制器的引用来执行此操作。
activityViewController
此方法的默认实现返回
nil
。使用视图控制器提供附加UI的子类可以重写此方法以返回该视图控制器。如果此方法返回有效对象,系统将为您显示返回的视图控制器,而不是调用performActivity
方法。在iPad上,您的视图控制器显示在弹出框内。在iPhone和iPod touch上,视图控制器以模态显示。您的自定义视图控制器应提供自定义UI的视图,并应处理这些视图中的任何用户交互。完成活动后,请勿自行关闭视图控制器。相反,请调用
activityDidFinish:
方法,让系统为您解除它。
请注意第一段末尾的位:在iPad上,视图控制器显示在弹出框内。在iPhone和iPod touch上,视图控制器以模态显示。
然而,在iPad上,activityViewController
返回的视图控制器总是以模态方式显示,无论我如何呈现UIActivityViewController(无论是模态还是通过弹出窗口)。当通过弹出窗口呈现时,它会导致崩溃,因为它不认为它被解雇了。
我做错了什么?这是iOS 6中的错误吗?
更新:这是一个简单的Xcode项目,用于说明问题。随意克隆它并四处玩,看看你是否能看到我们出错的地方:github.com/simonwhitaker/GSActivityDemo
答案 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
希望这会有所帮助