2012-11-17 65 views
13

在iOS 6中使用客户UIActivity子类时,可以指定一个自定义视图控制器,当您从初始UIActionViewController的视图中选择动作时将显示该控制器。您可以通过从UIActivity子类的activityViewController方法中返回对自定义视图控制器的引用来完成此操作。UIActivity activityViewController在iPad上而不是在弹出窗口中呈现

按照UIActivity class reference

activityViewController

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

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

需要注意的是位在第一段落的末尾:在iPad上,你的视图控制器提出了一种酥料饼的内部。在iPhone和iPod touch上,您的视图控制器将以模态方式呈现。

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

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


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

+0

什么是你的问题? – msgambel

+0

这里同样的问题。我修改了原来的帖子以添加一个明确的问题,希望你不介意@Gujamin。 –

+0

太宽泛,以不确定.... :(我可以开始疯狂的猜测,但我宁愿你编辑的问题,也许显示一些代码或这样的! - 哦,你用弧? –

回答

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]; 
    } 

} 
+0

嗨,Andy,不,那不是我们正在谈论的 - 我澄清了这个问题,我们谈论的是自定义视图控制器显示在用户选择一个动作后。给出一个具体的e xample,我将“上传到Dropbox”操作添加到我的应用程序中。所以有一个自定义的UIActivity子类,它为活动页添加了一个Dropbox按钮。当你点击那个按钮时,我显示一个自定义的VC,允许你为你的文件选择目标文件夹。这就是那个应该在iPad上弹出显示的VC,但总是以模态方式显示。 –

+0

道歉,这是一个奇怪的,因为我为Buffer做的UIActivity也在iPad上模态显示,但苹果的Twitter/Facebook工作表也是如此。我倾向于说这是iOS6的问题,或者文档是错误的。 – AndyDev

3

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

然而,关于解雇视图控制器的部分是一个不同的问题。你不应该关闭你从-[UIActivity activityViewController]返回的视图控制器,但是你是负责解除你提供的弹出窗口,这反过来也会从层次结构中删除你的自定义视图控制器。 (由于它以这种方式工作,我倾向于认为,自定义视图控制器通常必须在酥料饼中显示。)

下面是your example应用程序与代码的例子:

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

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

第二个想法,就像AndyDev提到的那样,除了打印对话框之外,所有其他内置活动也都以模态屏幕显示。另一个线索是,在呈现自定义视图控制器之前,它获取' - [UIViewController setModalTransitionStyle:]'消息,表明它确实有意要模态地呈现它。 – alloy

+0

在视图控制器问题上的好处不会消失。谢谢! –

+0

我猜可能有一个私人的API调用,苹果忽略公开,控制是否呈现activityViewController模态或在现有的弹出窗口。 –

-3

我有同样的问题,而是由视图控制器设置为解决它:

[yourViewController setModalPresentationStyle:UIModalPresentationPageSheet]; 

- (UIViewController *)activityViewController 

希望这有助于

+1

问题是它应该在iPad上的弹出窗口中显示。这不会发生,特别是如果您通过将演示文稿样式设置为页面表来强制执行此操作。 – Gujamin

1


我有同样的问题在iOS的7,以显示在酥料饼的自定义视图是创建并在-(void)performActivity方法表现出来,而不是在-(UIViewController *)activityViewController返回它的解决方案。

你可以看到示例代码在我的提问/回答这个链接下:
iOS 7 custom UIActivity as popover

相关问题