ios ipad UIPopoverController显示为空,没有错误

时间:2013-04-10 21:39:35

标签: ios ipad uiviewcontroller uipopovercontroller

我正在尝试实现一个能够共享的UIPopoverController,但是当UIPopoverController视图显示为空时,我没有任何错误。这是我的代码:

if ([self.activityPopoverController isPopoverVisible]) {
    [self.activityPopoverController dismissPopoverAnimated:YES];
} else {

    NSString *textToShare=@"I'm sharing this image";
    NSArray *activityItems = [[NSArray alloc]initWithObjects:self.imgToSend,textToShare,nil];
    UIActivityViewController *activityVC=[[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
     activityVC.excludedActivityTypes=@[UIActivityTypeAssignToContact,UIActivityTypeCopyToPasteboard ];


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

    if (self.activityPopoverController) {
        [self.activityPopoverController setContentViewController:activityVC];
    } else {
        self.activityPopoverController = [[UIPopoverController alloc] initWithContentViewController:activityVC];
    }
    [self.activityPopoverController presentPopoverFromRect:[(UIControl *)sender frame]
                                                    inView:self.view
                                  permittedArrowDirections:UIPopoverArrowDirectionAny
                                                  animated:YES];

} 

你们中的任何一个人都知道为什么我的代码出错了?

我非常感谢你的帮助。

更新:

我添加了这行代码:

 [self.activityPopoverController setPopoverContentSize:self.contentSizeForViewInPopover animated:YES];

但它看起来都很糟糕:

enter image description here

1 个答案:

答案 0 :(得分:0)

这里:

   NSArray *activityItems = [[NSArray alloc] 
                              initWithObjects:self.imgToSend,textToShare,nil];
   UIActivityViewController *activityVC=[[UIActivityViewController alloc]
                                          initWithActivityItems:activityItems 
                                          applicationActivities:nil];

如果self.imgToSendnil,则activityItems将为nil,您将获得空弹出框。因此,您需要检查self.imgToSend是否已初始化。请尝试NSLog("imgToSend: %@",self.imgToSend)检查此案例。

数组是nil,因为nil是数组终止符,所以如果你的第一个对象是nil,系统会认为你的数组在那时完成并且不会超出它(到例如textToShare

正如文档所说:

activityItems

  

此数组不能为nil且必须至少包含一个对象。

您可以通过交换两个数组项来检查我是否正确:

  NSArray *activityItems = [[NSArray alloc] 
                            initWithObjects:textToShare,self.imgToSend,nil];

更新
在您的更新问题中,您已经介绍了这一行:

[self.activityPopoverController setPopoverContentSize:self.contentSizeForViewInPopover     
                                             animated:YES];

你声称这可以通过用项目填充它来修复PopoverController活动,但控制器的框架设置不当。

这一行确实改变了popOver的框架,但由于所有错误的原因 - 你随意将框架设置为主机viewController的contentSizeForViewInPopover - 这是正在显示的viewController在popOver中。你也可以在那里放一些任意数字,例如:

[self.activityPopoverController setPopoverContentSize:(CGSize){300,400} 
                                             animated:YES];

这也将重塑你的popover - 但是这两个代码都不负责activityItems的存在与否。

如果现在出现activiyItems,您必须更改其他内容。我建议您现在尝试使用此行注释掉运行代码:

// [self.activityPopoverController setPopoverContentSize:self.contentSizeForViewInPopover     
//                                              animated:YES];

并报告发生的事情。

我确信你的问题在于self.imgToSend。如果我注意用本地设置的图像对象替换self.imgToSend,我可以在你的问题中运行你的代码完全,其中activiyItem正确显示。

这成功了:

     UIImage* image= [UIImage imageNamed:@"test.png"];
     NSArray *activityItems = [[NSArray alloc]initWithObjects:image,@"text",nil];

失败(空popOverController):

     UIImage* image= nil;
     NSArray *activityItems = [[NSArray alloc]initWithObjects:image,@"text",nil];

这成功了:

     UIImage* image= nil;
     NSArray *activityItems = [[NSArray alloc]initWithObjects:@"text",image,nil];

这成功了:

     UIImage* image= nil;
     NSArray *activityItems = [[NSArray alloc]initWithObjects:@"text",nil];

我建议您取出self.imgToSend并查看您的activityItems是否正确填充,然后至少您会知道问题所在。