Статьи

iOS SDK: предварительный просмотр и открытие документов

Песочница на iOS делает платформу намного более безопасной, и это в конечном итоге приносит пользу каждому пользователю платформы. Однако из-за строгих правил, присущих песочнице, обмен данными между приложениями не является тривиальным. UIDocumentInteractionController часто упускают из виду и который позволяет обмениваться документами между приложениями, является класс UIDocumentInteractionController . В этом кратком совете я покажу вам, как вы можете использовать этот класс для предварительного просмотра документов, а также для открытия документов в других приложениях, установленных на устройстве.


Я должен признать, что был немного удивлен, обнаружив, что UIDocumentInteractionController был с нами с iOS 3.2. Класс UIDocumentInteractionController является гибким в использовании и более мощным, чем большинство из нас понимает. Он не только позволяет разработчикам открывать документы в других приложениях, установленных на устройстве, но также поддерживает предварительный просмотр, печать, отправку по электронной почте и копирование документов.

Использовать класс UIDocumentInteractionController просто. Первым шагом является инициализация экземпляра класса путем вызова его единственного метода класса, interactionControllerWithURL: и передачи URL-адреса ( NSURL ) документа, с которым вы собираетесь работать. После установки свойства делегата контроллера взаимодействия с документами вы реализуете соответствующие методы делегата.

Имейте в виду, что UIDocumentInteractionController не является подклассом UIViewController . Другими словами, даже если предварительный просмотр документа осуществляется с помощью UIDocumentInteractionController , вы должны указать контроллеру взаимодействия с документом, какой контроллер представления использовать для предварительного просмотра документа. Что именно это означает, станет ясно, когда мы создадим пример приложения. В примере приложения я покажу, как (1) предварительно просмотреть документ и (2) открыть документ в другом приложении, которое поддерживает тип файла документа.


Как я упомянул минуту назад, наш пример приложения позволит пользователям просматривать документ и открывать его в другом приложении, установленном на устройстве. Последнее часто очень полезно, если вы хотите предоставить своим пользователям больше гибкости с точки зрения того, что они могут делать с данными, хранящимися в вашем приложении. Типичным примером является открытие фотографии в приложении для редактирования фотографий, например iPhoto.

Создайте новый проект в Xcode, выбрав шаблон приложения Single View Application из списка шаблонов (рисунок 1). Назовите документы приложения, введите идентификатор компании, установите iPhone для семейства устройств и установите флажок « Использовать автоматический подсчет ссылок» . Остальные флажки могут быть оставлены непроверенными для этого проекта (рисунок 2). Сообщите Xcode, где вы хотите сохранить проект, и нажмите кнопку « Создать» .

Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: выбор шаблона проекта - рисунок 1
фигура 1
Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: настройка нового проекта - рисунок 2
фигура 2

Пользовательский интерфейс нашего приложения будет содержать две кнопки: одну для предварительного просмотра PDF-документа и одну для открытия PDF-документа в другом приложении. Прежде чем мы создадим пользовательский интерфейс, создайте действие для каждой кнопки в файле реализации контроллера представления, как показано ниже.

1
2
3
— (IBAction)previewDocument:(id)sender {
 
}
1
2
3
— (IBAction)openDocument:(id)sender {
 
}

Выберите MTViewController.xib и перетащите два экземпляра UIButton из библиотеки объектов справа в представлении контроллера представления (рисунок 3). Выберите объект «Владелец файла» слева, откройте « Инспектор соединений» и соедините действия, которые мы создали недавно, с помощью кнопок (рисунок 4). Это все, что нам нужно сделать в Интерфейсном Разработчике.

Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: создание пользовательского интерфейса - рисунок 3
Рисунок 3
Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: соединение действий с кнопками - рисунок 4
Рисунок 4

Документ, с которым мы будем работать, — это документ PDF. Вы можете использовать любой PDF-документ, но я включил образец PDF-документа в исходные файлы этого краткого совета. Это руководство по программированию iOS от Apple, которое вы также можете найти в Интернете . Перетащите документ в свой проект и убедитесь, что при появлении соответствующего запроса установите флажок Копировать элементы в папку целевой группы (при необходимости) (рисунок 5). Также убедитесь, что документ добавлен в цель « Документы» (рисунок 5).

Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: добавление образца документа PDF в проект - рисунок 5
Рисунок 5

При использовании класса UIDocumentInteractionController важно помнить две вещи: (1) необходимо хранить ссылку на контроллер взаимодействия документов и (2) должен быть реализован протокол UIDocumentInteractionControllerDelegate . Начните с обновления заголовочного файла контроллера представления, как показано ниже, для информирования компилятора о том, MTViewController класс MTViewController соответствует протоколу UIDocumentInteractionControllerDelegate .

1
2
3
4
5
#import <UIKit/UIKit.h>
 
@interface MTViewController : UIViewController <UIDocumentInteractionControllerDelegate>
 
@end

В файле реализации контроллера представления добавьте приватное свойство типа UIDocumentInteractionController и назовите его documentInteractionController . Это свойство будет хранить ссылку на контроллер взаимодействия с документами, который мы будем использовать.

Давайте теперь посмотрим на реализацию previewDocument: action. Мы начнем с получения URL ( NSURL ) документа. Поскольку документ является частью пакета приложения, получить URL документа очень просто благодаря удобному методу класса NSBundle (см. Ниже).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
— (IBAction)previewDocument:(id)sender {
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@»sample» withExtension:@»pdf»];
 
    if (URL) {
        // Initialize Document Interaction Controller
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
 
        // Configure Document Interaction Controller
        [self.documentInteractionController setDelegate:self];
 
        // Preview PDF
        [self.documentInteractionController presentPreviewAnimated:YES];
    }
}

Если нам возвращается действительный URL-адрес, мы инициализируем экземпляр класса UIDocumentInteractionController и передаем URL-адрес документа. Мы сохраняем ссылку на контроллер взаимодействия с documentInteractionController свойстве documentInteractionController мы создали минуту назад. Наш контроллер представления будет служить делегатом контроллера взаимодействия с документами. Представить предварительный просмотр PDF-документа так же просто, как вызвать presentPreviewAnimated: на контроллере взаимодействия документов.

Если бы вы сейчас собрали и запустили приложение, вы бы заметили, что ничего не произойдет, если нажать кнопку « Просмотр» . Есть один метод делегата, который нам нужно реализовать первым. Несколько минут назад я говорил вам, что важно понимать, что класс UIDocumentInteractionController является подклассом NSObject , а не UIViewController . Несмотря на то, что он позаботится об отображении документа, нам нужно указать контроллеру взаимодействия с документом, какой контроллер представления использовать для предварительного просмотра документа. Один из методов UIDocumentInteractionControllerDelegate протокола UIDocumentInteractionControllerDelegate запрашивает у делегата контроллер представления, который он может использовать для предварительного просмотра документа. Этот метод делегата имеет соответствующее имя documentInteractionControllerViewControllerForPreview: Поскольку мы хотим отобразить предварительный просмотр в нашем главном контроллере представления, мы можем просто вернуть self как показано в реализации ниже. Это означает, что контроллер взаимодействия с документами будет использовать наш контроллер представления для предварительного просмотра PDF-документа. Это представит модальное представление, в котором это представляет документ.

1
2
3
— (UIViewController *) documentInteractionControllerViewControllerForPreview: (UIDocumentInteractionController *) controller {
    return self;
}

Конечно, вы можете изменить реализацию documentInteractionControllerViewControllerForPreview: в соответствии с вашими потребностями. С реализованным методом делегата пришло время впервые собрать и запустить наше приложение и попробовать его (рисунок 6). Обратите внимание, что вы даже можете отправить образец документа по электронной почте, распечатать его или скопировать в буфер обмена. Кроме того, можно открыть документ в любом другом приложении, которое поддерживает тип файла документа. Нажмите кнопку в правом верхнем углу, чтобы увидеть, что я имею в виду (рисунок 7).

Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: предварительный просмотр документа - рисунок 6
Рисунок 6
Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: общий доступ к документу - рисунок 7
Рисунок 7

Во многих ситуациях, однако, более целесообразно разрешить пользователям открывать документ в другом приложении без предварительного предварительного просмотра документа. Чтобы сделать это возможным в нашем примере приложения, нам нужно реализовать действие openDocument: . Как и в previewDocument: action, мы получаем URL образца PDF-документа в комплекте приложений и используем его для инициализации экземпляра класса UIDocumentInteractionController . После установки делегата контроллера взаимодействия с документами мы представляем меню, вызывая presentOpenInMenuFromRect:inView: на контроллере взаимодействия с документами. CGRect который мы передаем в качестве первого аргумента, является рамкой кнопки, как вы можете видеть в фрагменте кода ниже.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
— (IBAction)openDocument:(id)sender {
    UIButton *button = (UIButton *)sender;
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@»sample» withExtension:@»pdf»];
 
    if (URL) {
        // Initialize Document Interaction Controller
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
 
        // Configure Document Interaction Controller
        [self.documentInteractionController setDelegate:self];
 
        // Present Open In Menu
        [self.documentInteractionController presentOpenInMenuFromRect:[button frame] inView:self.view animated:YES];
    }
}

Для тестирования действия openDocument: важно запустить пример приложения на физическом устройстве. Причина проста. Операционная система проверяет, какие приложения на устройстве поддерживают тип файла (UTI), который мы хотим открыть. Если он не может найти приложения, поддерживающие соответствующий тип файла, он не будет отображать меню « Открыть в», и именно это произойдет в iOS Simulator.

Чтобы проверить эту функцию, убедитесь, что на вашем физическом устройстве установлено приложение, принимающее документы PDF, например Dropbox или приложение Amazon Kindle .

Предварительный просмотр и открытие документов с помощью UIDocumentInteractionController: Открытие документа - рисунок 8
Рисунок 8

Как вы можете видеть, предварительный просмотр и открытие документов очень просто с помощью класса UIDocumentInteractionController . Я рекомендую вам изучить его ссылку на класс, а также протокол UIDocumentInteractionControllerDelegate . Существует много других методов делегирования, которые могут пригодиться, особенно при работе с большими документами или сложными рабочими процессами.