1

我正在尝试实现一个 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];

但它看起来都被砍掉了:

在此处输入图像描述

4

1 回答 1

0

这里:

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

如果self.imgToSendnilactivityItems将会是nil,你会得到一个空的弹出框。因此,您需要检查是否self.imgToSend已初始化。尝试NSLog("imgToSend: %@",self.imgToSend)检查这种情况。

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

正如文档所说:

活动项目

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

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

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

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

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

并且您声称这通过使用项目填充活动 PopoverController 来修复活动,但控制器的框架设置错误。

这条线确实改变了 popOver 的框架,但出于所有错误的原因 - 您将框架任意设置为主机 viewController 的 contentSizeForViewInPopover - 这不是popOver 中显示的 viewController。您也可以在其中放一些任意数字,例如:

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

这也将重塑您的弹出框 - 但在这两种情况下,此代码都不负责 activityItems 的存在或不存在。

如果现在出现了 activiyItems,那么您一定也更改了其他内容。我建议您现在尝试在注释掉这一行的情况下运行您的代码:

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

并报告发生了什么。

我真的很确定你的问题在于self.imgToSend。如果我注意替换为本地设置的图像对象,我可以完全按照您的问题运行您的代码,并且 activiyItems 显示正确。self.imgToSend

这成功了:

     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是否在没有它的情况下正确填充,那么至少你会知道问题出在哪里。

于 2013-04-11T01:22:19.020 回答