Monotouch:UIDocumentInteractionController预览右侧栏按钮在iPhone中不起作用

时间:2012-08-27 20:42:16

标签: c# iphone ios xamarin.ios

我在支持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;
    }
}

与往常一样,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我基本上将此标记为已解决,因为它不会导致应用或控制器无法正常工作。最终我相信我将不得不用我自己的控制器代替整个东西,因为它对品牌/皮肤不太友好。如果它提供了从标签栏中呈现的能力,那将是非常好的。

我注意到的一件事是,当它在界面生成器中定义的标签栏中的导航控制器中呈现时,文档控制器将抛出相同的警告,但从不出现。以编程方式创建tabbar并显式定义RectangleF将允许控制器显示但仍然会抛出警告。

我最好的猜测是PresentPreview(true)假设它应该从调用该事件的控件中呈现,不幸的是,该控件是从右侧栏按钮显示的操作表中的按钮。我愿意接受任何更多建议,以获得消除警告。