我正在尝试实现一个能够共享的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];
但它看起来都很糟糕:
答案 0 :(得分:0)
这里:
NSArray *activityItems = [[NSArray alloc]
initWithObjects:self.imgToSend,textToShare,nil];
UIActivityViewController *activityVC=[[UIActivityViewController alloc]
initWithActivityItems:activityItems
applicationActivities:nil];
如果self.imgToSend
为nil
,则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是否正确填充,然后至少您会知道问题所在。