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

Posted

技术标签:

【中文标题】ios ipad UIPopoverController 显示为空且没有错误【英文标题】:ios ipad UIPopoverController is showing empty with no errors 【发布时间】:2013-04-10 21:39:35 【问题描述】:

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

但它看起来都被砍掉了:

【问题讨论】:

你是否在 UIActivityViewController 上设置 contentSizeInPopover 属性? 我不是 :( 我该怎么做? @HelenaM,我认为这不是原因,请检查我的答案。 contentSize 技巧具有误导性,您不应设置它。系统计算出activityViewController 的弹出框的contentSize。您将其任意设置为 viewController 视图的 contentSize,这是不正确的。我确定您的问题出在其他地方。 【参考方案1】:

这里:

   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 - 不是正在显示的 viewController在弹出窗口中。你也可以在里面放一些任意的数字,例如:

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

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

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

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

并报告发生了什么。

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

这成功了:

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

【讨论】:

图片要附加在邮件中,但不是nil activityitems 数组都不为空 @Helena,您能否在您的问题中添加NSLogactivityItems。如果你只是从数组中删除 self.imgToSend 会发生什么,那么它看起来如何? 我认为你没有抓住重点。问题不在于数组。问题是 UIPopoverController 在视图中的显示方式。 @HelenaM,您报告了一个空的 popOver 视图,这是由空数组引起的。只要 img 变量具有正确的内容,您的代码在我的系统上就可以正常工作,所以我仍然怀疑该变量存在一些问题。如果你只是删除它会发生什么,弹出框看起来如何? (没有那个contentSizeForViewInPopover 分心)。您更新的问题(带图像)没有显示空白视图,这里可能存在多个问题。问题不在于您报告的代码。

以上是关于ios ipad UIPopoverController 显示为空且没有错误的主要内容,如果未能解决你的问题,请参考以下文章

Ipad图标大小Ipad设置ios 5-7 29pt 1x 2x - iPad聚光灯ios 7 40 pt - iPad app ios 7 76 pt [关闭]

iOS:iOS 9 上 iPad 的 TableViewCell 背景

有了iOS11 iPad更强大!

(iOS) iPad 应用程序在启动时随机崩溃

iOS-iPad 旧iPad项目不能全屏运行,两边留有黑边

iOS (iPad) 上的 iframe 内容裁剪问题