如何(以编程方式)判断是否有任何支持打开特定文档类型的注册应用程序?

时间:2011-06-04 00:22:08

标签: iphone ios uti

Apple的UIDocumentInteractionController文档presentOpenInMenuFromBarButtonItem:animated:方法声明“如果没有支持打开文档的注册应用程序,文档交互控制器不会显示菜单。”在我的应用中,我想显示一个按钮当且仅当设备上有应用程序打开它时。 (我只希望按钮弹出一个菜单来打开文件;我不想要QuickLook,复制或打印)。事实上,如果按钮在那里,但没有注册可以打开相关文件的应用程序,则用户会获得令人不满意的按钮体验,该按钮在点按时不会执行任何操作。

那么 - 我能否知道是否有任何/不支持打开特定文档类型的注册应用程序?显然,UIDocumentInteractionController实例可以找到它。是否有公共API方法可以找到它?

2 个答案:

答案 0 :(得分:11)

好的,更多的研究表明stackoverflow用户frenchkiss-dev有一个solution - 源于比我更仔细地阅读文档和一些横向思维。我的代码基于frenchkiss-dev的答案,位于ViewDidAppear方法中,如果打开然后关闭打开的文件菜单(没有动画),则会禁用我的按钮,这表明没有可以处理打开文件的应用程序。此代码段的上下文是已在viewDidLoad中设置了UIDocumentInteractionController,并通过[self docInteractionController]进行访问。

BOOL isAnAppToOpenURL = [[self docInteractionController] presentOpenInMenuFromRect:CGRectZero inView:[self view] animated: NO];
[[self docInteractionController] dismissMenuAnimated:NO];

if (!isAnAppToOpenURL)
{
    // iOS think NO app is present on the device that
    // can open the URL set on the UIDocumentInteractionController
    [[self openFileButton] setEnabled:NO];
}

答案 1 :(得分:1)

//Connect up theOpenInBtn in IB


@interface DocumentViewerViewController ()
{

    IBOutlet UIWebView *webView;
    NSURL *fileURL;
    NSData *fileOnline;
    UIDocumentInteractionController *dic;
    IBOutlet UIBarButtonItem *theOpenInBtn;

}


(void)viewDidLoad
{
     [super viewDidLoad];


    BOOL isAnAppToOpenURL = [dic presentOpenInMenuFromRect:CGRectZero inView:[self view] animated: NO];
    [dic dismissMenuAnimated:NO];

    if (!isAnAppToOpenURL)
    {
        // iOS think NO app is present on the device that
        // can open the URL set on the UIDocumentInteractionController
        [theOpenInBtn setEnabled:NO];
    }


}