2

В приложении IOS, вы можете получить ссылку на разделяемой приложение делегата по:Что такое UIApplication.sharedApplication(). Делегировать в WatchKit?

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

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

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

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

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

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

ответ

2

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

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

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

объективно- C:
WKExtensionDelegate *delegate = [[WKExtension sharedExtension] delegate];

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


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

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

0
extension ExtensionDelegate { 
    static var shared: ExtensionDelegate { 
     guard let delegate = WKExtension.shared().delegate as? ExtensionDelegate else { 
      fatalError("ExtensionDelegate") 
     } 
     return delegate 
    } 
}