В приложении iOS вы можете получить ссылку на делегат совместно используемого приложения:
Swift: let delegate = UIApplication.sharedApplication().delegate as! AppDelegate
Objective-C: AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
В расширении приложения WatchKit2 есть аналогичный делегат приложения, и я хочу получить ссылку на него в контроллере представления для доступа к общим ресурсам в приложении, таким как ManagedObjectModel и PersistentStoreCoordinator для стека основных данных, которые у меня есть инициализируется в App Delegate.
Однако UIApplication.sharedApplication().delegate as! AppDelegate
сообщает об ошибке,
Использование неразрешенного идентификатора "UIApplication"
Как я могу получить доступ к делегату приложения в расширении приложения WatchKit2?
Класс WKExtension
в WatchOS 2 автоматически предоставляет единый объект расширения для каждого расширения, чтобы управлять поведением, которое является общим для всех ваших интерфейсных контроллеров приложений. В Apple Documentation отмечается, что вы используете объект расширения для выполнения задач на уровне приложения, таких как открытие 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: "Вы предоставляете объект делегата и используете его для управления событиями жизненного цикла в своем расширении. Требуется объект-делегат если ваше расширение поддерживает действительные уведомления или поведение Handoff."
Вы узнаете, есть ли у вашего расширения приложения 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
}
}