Что эквивалентно UIApplication.sharedApplication(). Делегат в WatchKit?

В приложении iOS вы можете получить ссылку на делегата общего приложения:

Swift:
let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

Objective-C:
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

В расширении приложения WatchKit2 есть аналогичный делегат приложения, и я хочу получить ссылку на него в контроллере представления для доступа к общим ресурсам в приложении, таким как ManagedObjectModel и PersistentStoreCoordinator для стека базовых данных, которые я инициализировал в Приложение делегат.

Тем не мение, UIApplication.sharedApplication().delegate as! AppDelegate сообщает об ошибке,

Использование неразрешенного идентификатора "UIApplication"

Как я могу получить доступ к делегату приложения в расширении приложения WatchKit2?

2 ответа

Решение

WKExtension Класс в WatchOS 2 автоматически предоставляет один объект расширения для каждого расширения, чтобы управлять поведением, которое используется всеми контроллерами интерфейса вашего приложения. В документации Apple отмечается, что "вы используете объект расширения для выполнения задач уровня приложения, таких как открытие URL-адресов и получение контроллера корневого интерфейса вашего приложения".

Как и в iOS, в расширении приложения WatchKit вы предоставляете собственный объект делегата, на который вы пытаетесь сослаться. Это автоматически присваивается свойству делегата объекта WKExtension, и к нему можно получить доступ, используя метод, аналогичный тому, который использовался для доступа к делегату UIApplication в iOS:

Swift:
let delegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate

Objective-C:
WKExtensionDelegate *delegate = [[WKExtension sharedExtension] delegate];

Документация Apple по классу WKExtension содержит дополнительную информацию о возможностях.


Идем глубже:
Расширения приложения WatchKit не обязательно должны предоставлять WKExtensionDelegate. Как отмечается в документации WKExtensionDelegate от Apple, "вы предоставляете объект делегата и используете его для управления событиями жизненного цикла в вашем расширении. Предоставление объекта делегата требуется, если ваше расширение поддерживает действенные уведомления или поведения передачи обслуживания".

Вы узнаете, есть ли в вашем расширении приложения WatchKit объект делегата, и если он есть, в жизненном цикле вашего расширения приложения не будет точки, в которой вы пытаетесь получить доступ к этому делегату приложения там, где его не будет. Поэтому пока WKExtension.sharedExtension().delegate является необязательным (расширения приложения WatchKit могут существовать, если не установлен ни один делегат), его можно использовать безопасно as! заставить приведение возврата быть необязательным в приведенном выше примере, учитывая, что разработчик знает, что он установил WKExtensionDelegate в своем расширении приложения.

extension ExtensionDelegate {
    static var shared: ExtensionDelegate {
        guard let delegate = WKExtension.shared().delegate as? ExtensionDelegate else {
            fatalError("ExtensionDelegate")
        }
        return delegate
    }
}
Другие вопросы по тегам