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

2

В приложении 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?

Теги:
watchkit
uiapplicationdelegate

2 ответа

2
Лучший ответ

Класс 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 в своем приложении.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню