在SDK iOS 6中,使用UIDocumentInteractionController打开时如何过滤选项(canPerformActions已被弃用)

16
自从新的SDK发布(iOS 6)以来,UIDocumentInteractionControllerDelegate的代理方法documentInteractionController:canPerformAction:已经被弃用。使用该方法可以防止默认操作如print:copy:出现。这个方法在当前版本的iOS 6中被调用,但在将来的版本中将不会被调用,我的应用程序会显示一些我不想支持的操作。我读了UIDocumentInteractionController及其代理的所有可用文档,但无法找到另一种方法来执行canPerformAction方法所做的事情。有什么建议吗?此外,若能过滤掉邮件或者Twitter之类的应用就更好了(因为它们是默认出现的),但我猜这可能是不可能的。
2个回答

8

考虑到在委托中弃用“canPerformAction”是麻烦的,我们失去了过去所拥有的精细控制。

然而,如果您只想允许文档在另一个应用程序中打开,并希望删除复制、打印甚至邮件,那么最好使用方法的OpenIn版本来呈现UIDocumentInteractionController

即对于您的UIDocumentInteractionController,请使用presentOpenInMenuFromBarButtonItem:animated:presentOpenInMenuFromRect:inView:animated:

(而不是presentOptionsMenuFromBarButtonItem:animated:presentOptionsMenuFromRect:inView:animated:)

这样,默认情况下,它只会显示可以打开您的文档的应用程序,并隐藏邮件、复制和打印。


1
这种方式也会使其他选项不可用(如FB、Twitter等)。如果有人想要OpenIn和FB怎么办? - Nat
在模拟器上可能没有安装的应用程序来打开内容,菜单也不会显示。请参阅此问答:http://stackoverflow.com/questions/23624218/presentopeninmenufrombarbuttonitem-doesnt-cause-menu-to-appear - Suragch
顺便说一句,这并不会使其他选项无效。目前,这是例如分享到 Instagram 的唯一方法。这是 iOS 应用间共享/通信的悲惨状态。 - Martin Marconcini

6
我认为这是因为苹果希望您使用新的UIActivity控件。

这里是文档:

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIActivity_Class/Reference/Reference.html

这是一个定制控件,旨在支持许多第三方应用程序:

http://www.cocoacontrols.com/platforms/ios/controls/uiactivitycollection

这个问题解决了如何制作自己的UIActivity

https://dev59.com/BWcs5IYBdhLWcg3wiEmK#12766330

所以,如果您不希望用户使用“复制”和“打印”方法,只需将这些活动传递给UIActivityViewController,像这样:
[activityView setExcludedActivityTypes:[NSArray arrayWithObjects:UIActivityTypeCopyToPasteboard, UIActivityTypePrint, nil]];

所有默认的活动都在苹果文档链接的底部列出。

嘿,谢谢你的回答!我没想到会是这样的哈哈。我会深入研究这个问题,但乍一看似乎是未来的趋势。再次感谢! - Omer
12
如果这是真的,那么你该如何在另一个应用程序中打开文件(目前正在使用UIDocumentInteractionController的openWith...和QuickLookPreview)?据我所知,在UIActivityViewController中没有支持此功能(除了UIActivityViewController还有一些相当严重的限制)。 - auco
5
同意auco的观点 - 如何在iOS6中打开xlxs或类似的文件? - Rossi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接