Как проверить, если UIDocumentInteractionController не сможет открыть документ из-за отсутствия внешнего приложения на iPad? - PullRequest
18 голосов
/ 10 февраля 2011

Я использую UIDocumentInteractionController для отображения всплывающего меню «Открыть в ...», чтобы пользователь мог открыть документ в другом приложении.

Метод presentOpenInMenuFromBarButtonItem:animated: возвращает NO, если нетПриложение может открыть данный документ (меню не будет отображаться).Но мне уже поздно ждать, пока я зайду так далеко.Я хотел бы отключить кнопку, инициирующую это открытие, если это невозможно, вместо того, чтобы повышать ожидания пользователя, а затем сказать: «Извините, открыть ее невозможно».

Можно ли запросить систему, чтобы узнать, зарегистрировано ли хотя бы одно приложение для определенного типа документа? Я проверил canPreviewItem: в QLPreviewController, но, похоже, это не так• Поддерживает те же типы документов, которые может обрабатывать UIDocumentInteractionController.

Ответы [ 5 ]

11 голосов
/ 11 мая 2011

[EDIT] Не работает для iOS 6.0 (см. Комментарий)

Кажется, что dismissMenuAnimated (без анимации вообще) является ключом:

-(BOOL)canOpenDocumentWithURL:(NSURL*)url inView:(UIView*)view {
    BOOL canOpen = NO;
    UIDocumentInteractionController* docController = [UIDocumentInteractionController 
                                                   interactionControllerWithURL:url];
    if (docController)
    {
        docController.delegate = self;
        canOpen = [docController presentOpenInMenuFromRect:CGRectZero
                                   inView:self.view animated:NO];                   
        [docController dismissMenuAnimated:NO];
    }
    return canOpen;
}

Он вернет ДА, если хотя бы одно приложение сможет открыть файл, на который указывает url. По крайней мере, в моем случае это работает (файлы KMZ), тестирование с / без приложения Dropbox на iPhone iOS 4.3.
На самом деле, это работает, даже если url не указывает на фактический файл (т.е. @ "test.kmz"), но я бы не стал полагаться на него для всех типов файлов.

5 голосов
/ 08 мая 2013

Я придумал менее хакерский способ действий, но есть ограничение, которое вы можете определить, есть ли совместимое приложение только после того, как пользователь выбрал его для открытия в приложении.Это позволит вам обеспечить тот же пользовательский интерфейс, что и в приложении Dropbox.

Все, что вам нужно сделать, - это установить UIDocumentInteractionControllerDelegate и создать свойство логического флага, которое будет отображать, было ли представлено меню.

В интерфейсе:

/**
 The document interaction controller used to present the 'Open with' dialogue.
 */
@property (nonatomic,strong) UIDocumentInteractionController *documentInteractionController;

/**
 Boolen that holds whether or not there are apps installed that can open the URL.
 */
@property (nonatomic) BOOL hasCompatibleApps;

В реализации:

- (void)shareFileAtURL:(NSURL*)fileURL
{
    [self setDocumentInteractionController:[UIDocumentInteractionController interactionControllerWithURL:fileURL]];
    [[self documentInteractionController] setDelegate:self];

    [self setHasCompatibleApps:NO];

    [[self documentInteractionController] presentOpenInMenuFromRect:[self popoverRect] inView:[self popoverView] animated:YES];

    if (![self hasCompatibleApps])
    {
        // Show an error message to the user.
    }
}

#pragma mark - UIDocumentInteractionControllerDelegate methods

- (void)documentInteractionControllerWillPresentOpenInMenu:(UIDocumentInteractionController *)controller
{
    [self setHasCompatibleApps:YES];
}

Надеюсь, это поможет некоторым людям.

3 голосов
/ 29 июля 2014

Это работает для меня:

   self.docController = [UIDocumentInteractionController interactionControllerWithURL:url];
   UIView *v = [[UIView alloc] init];
   BOOL isAnAppAvalaible = [self.docController presentOpenInMenuFromRect:CGRectZero inView:v animated:NO];
0 голосов
/ 04 мая 2015
NSURL *url = [NSURL URLWithString:@"path_to_the_file"];
UIDocumentInteractionController *controller =
    [UIDocumentInteractionController interactionControllerWithURL:url];
BOOL openResult = [controller presentPreviewAnimated:NO];

Если вы используете presentPreviewAnimated: для отображения файлов, вы можете использовать openResult, чтобы определить, успешно ли он был открыт.

0 голосов
/ 10 февраля 2011

-[UIApplication canOpenURL:] должны выполнить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...