Как использовать разные контроллеры представления для каждого настраиваемого намерения для ярлыков siri?

У меня есть прототипы ярлыков siri в моем приложении, успешно использующие настраиваемые намерения. Я хотел бы определить пользовательский интерфейс для разных типов ярлыков. Например, IntentA покажет высокую карточку с множеством меток, а IntentB покажет короткую карточку с изображением и одной меткой.

Я не вижу прямой связи в коде между IntentViewController, используемым в раскадровке MainInterface, и файлом определения намерений.

Если возможно, я хотел бы, чтобы IntentAViewController и IntentBViewController были определены в раскадровке MainInterface и обрабатывали их соответствующим образом, но я не вижу, где я мог бы сообщить расширению, какой контроллер представления или идентификатор раскадровки загружать для каждого намерения.

Если это невозможно, то как лучше всего реализовать несколько пользовательских интерфейсов с намерениями? (Я не нашел никаких руководств, в которых было бы более одного намерения).


person rmooney    schedule 20.08.2018    source источник


Ответы (1)


Я нашел решение в примере приложения SoupChef от Apple. Поскольку существует только один основной IntentViewController и одна раскадровка MainInterface, используя намерения, вы должны определить тип намерения и добавить необходимый контроллер представления в качестве дочернего элемента IntentViewController.

Из IntentViewController в SoupChef:

/* Different UIs can be displayed depending if the intent is in the confirmation phase or the handle phase. This example uses view controller containment to manage each of the different views via a dedicated view controller. */ if interaction.intentHandlingStatus == .ready { let viewController = InvoiceViewController(for: intent) attachChild(viewController) completion(true, parameters, desiredSize) } else if interaction.intentHandlingStatus == .success { if let response = interaction.intentResponse as? OrderSoupIntentResponse { let viewController = OrderConfirmedViewController(for: intent, with: response) attachChild(viewController) completion(true, parameters, desiredSize) } } (где дочерний элемент attach вызывает addChild, addSubview, didMove и устанавливает ограничения)

person rmooney    schedule 22.08.2018