16

Since the new SDK was release (iOS 6), the delegate method documentInteractionController:canPerformAction: of the UIDocumentInteractionControllerDelegate is deprecated.

Using that method you were able to prevent default actions like print: and copy: to appear.

The method is being called in the current version of iOS 6, but in future versions this method will not be called and my app will show actions that I don't want to support.

I read the available documentation for the UIDocumentInteractionController and its delegate and I'm not able to find a another way to do what I do in the canPerformAction method.

Any ideas?

As a plus, it would be great to be able to filter apps like mail or twitter (that appears by default) but I guess that this is not possible.

Mehul Mistri
  • 15,037
  • 14
  • 70
  • 94
Omer
  • 5,470
  • 8
  • 39
  • 64

2 Answers2

8

Agreed on the fact that deprecating 'canPerformAction' in the delegate is troublesome, we lost the fine grain control we used to have.

However, if all you want is to allow a document to be opened in another app, and wanted to remove Copy, Print and even Mail, I guess you are better off using OpenIn version of method to present the UIDocumentInteractionController?

i.e. for your UIDocumentInteractionController use presentOpenInMenuFromBarButtonItem:animated: or presentOpenInMenuFromRect:inView:animated:

(instead of presentOptionsMenuFromBarButtonItem:animated: or presentOptionsMenuFromRect:inView:animated:)

This way, by default, it will only show apps that can open your document, and hides Mail, Copy and Print.

P.L.
  • 1,498
  • 14
  • 18
  • 1
    This way makes rest of options unavailable too (FB, Twitter etc). What if someone wants to have OpenIn and FB..? – Nat Jan 02 '14 at 14:50
  • On the simulator there may be no installed apps to open the content and the menu will not show. See this Q&A: http://stackoverflow.com/questions/23624218/presentopeninmenufrombarbuttonitem-doesnt-cause-menu-to-appear – Suragch Mar 11 '16 at 06:37
  • It doesn't make the other options unavailable btw. And it's currently the _only_ way to Share to Instagram, for example. The sad state of iOS inter-app sharing/communications. – Martin Marconcini Mar 17 '16 at 22:55
6

I think it is because Apple wants you to use the new UIActivity control.

Here it's the documentation:

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

Here it's a custom control developed to support many third party apps:

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

And this question solves how could you make your own UIActivity:

https://stackoverflow.com/a/12766330/736384

So, if you don't want the user can use copy: and print: methods just pass this activities to the UIActivityViewController, like this:

[activityView setExcludedActivityTypes:[NSArray arrayWithObjects:UIActivityTypeCopyToPasteboard, UIActivityTypePrint, nil]];

All the default activities are listed at the bottom of the Apple's documentation link.

Community
  • 1
  • 1
Luis Ascorbe
  • 1,985
  • 1
  • 22
  • 36
  • Hey.. thanks for the answer! I didn't see that coming jaja I will dig into this, but at a glance it seems to be the future. Thanks again! – Omer Dec 26 '12 at 13:59
  • 12
    so... if this were true, how would you open a file in another application (currently working with UIDocumentInteractionController's openWith… and QuickLookPreview?). AFAICS there's no support for this in UIActivityViewController (besides that UIActivityViewController has some quite severe limitations as well) – auco Jan 02 '13 at 13:30
  • 5
    Agree with auco - how can you now open in... xlxs or similar with iOS6? – Rossi Jan 07 '13 at 17:01