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

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

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

Цель-C:
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

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

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

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

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


person Duncan Babbage    schedule 28.03.2016    source источник


Ответы (1)


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

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

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

Цель-C:
WKExtensionDelegate *delegate = [[WKExtension sharedExtension] delegate];

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


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

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

person Duncan Babbage    schedule 28.03.2016