我在支持iPhone和iPad的通用应用程序中工作。我目前可以使用UIDocumentInteractionController来呈现PDF并在该PDF上提供一些选项(最重要的是Print功能)。所有内容都可以在iPad上完美呈现,概述即将到来,预览中的RightBarButtonItem可以正常打印。但是,使用iPhone时,当我单击RightBarButtonItem时,我收到错误:
Presenting action sheet clipped by its superview. Some controls might not respond to touches. On iPhone try -[UIActionSheet showFromTabBar:] or -[UIActionSheet showFromToolbar:] instead of -[UIActionSheet showInView:].
使用典型的操作表解决这个问题相对简单:
ActionSheet.ShowFromTabBar(this.TabBarController.TabBar);
ActionSheet.ShowFromToolbar(this.NavigationController.ToolBar);
然而,使用煮熟的文档控制器,我发现很难掌握如何做到这一点。与我在这里找到的其他实现相比,交互控制器的代码是非常标准的,所以我确信有一些我想念的东西。这是实施目标:
invoiceInteractionController = UIDocumentInteractionController.FromUrl(url);
invoiceInteractionController.Delegate = new UIDocumentInteractionControllerDelegateClass(this);
InvokeOnMainThread(delegate{
if (!DeviceHelper.IsIPhone())
invoiceInteractionController.PresentOptionsMenu(NavigationItem.RightBarButtonItem, true);
else {
invoiceInteractionController.PresentPreview(true);
}
});
目前,如果该设备是iPhone,我只是直接跳到预览,您可以在此代码中看到。当按下右上方的按钮项时,问题出在预览控制器内,这会引发上述问题。但是,顺便说一下,将PresentPreview()替换为:
invoiceInteractionController.PresentOptionsMenu(new RectangleF(320,320,0,500), this.NavigationController.Toolbar, true);
这也会引起同样的错误。
我几乎想知道它是否与我的委托类有关,如下所示:
public class UIDocumentInteractionControllerDelegateClass : UIDocumentInteractionControllerDelegate
{
UIViewController viewC;
public UIDocumentInteractionControllerDelegateClass (UIViewController controller)
{
viewC = controller;
}
public override UIViewController ViewControllerForPreview (UIDocumentInteractionController controller)
{
return viewC;
}
public override UIView ViewForPreview (UIDocumentInteractionController controller)
{
return viewC.View;
}
public override RectangleF RectangleForPreview (UIDocumentInteractionController controller)
{
return viewC.View.Frame;
}
}
与往常一样,非常感谢任何帮助。
答案 0 :(得分:0)
我基本上将此标记为已解决,因为它不会导致应用或控制器无法正常工作。最终我相信我将不得不用我自己的控制器代替整个东西,因为它对品牌/皮肤不太友好。如果它提供了从标签栏中呈现的能力,那将是非常好的。
我注意到的一件事是,当它在界面生成器中定义的标签栏中的导航控制器中呈现时,文档控制器将抛出相同的警告,但从不出现。以编程方式创建tabbar并显式定义RectangleF将允许控制器显示但仍然会抛出警告。
我最好的猜测是PresentPreview(true)假设它应该从调用该事件的控件中呈现,不幸的是,该控件是从右侧栏按钮显示的操作表中的按钮。我愿意接受任何更多建议,以获得消除警告。