Конфигурация WidgetKit, один параметр основан на выборе другого параметра

Я работаю над виджетом WidgetKit с двумя динамическими параметрами. Один из этих параметров ограничен вариантами, разрешенными первым. Допустим, первый - это капитан, а второй - это капитанский корабль. Допустимые конфигурации могут быть (без учета канона):

Captains: [Kirk, Picard, Crunch]
Captain: Kirk, Ship: [Enterprise, Galileo]
Captain: Picard, Ship: [Enterprise, Voyager, Cube]
Captain: Crunch, Ship: [Sugar, Berry, Chocula]

У меня работает логика. Например, если пользователь выбирает Picard, а затем нажимает кнопку «Отправить», доступны только варианты Enterprise, Voyager и Cube. Затем пользователь может выбрать один из этих кораблей (скажем, Cube), и все в порядке.

Однако опция «Корабль» не меняется и не сбрасывается при смене капитана. Допустим, после вышеуказанной настройки пользователь меняет капитана на Кирка. Корабль остается настроенным на Куб. Пользователь может выйти из конфигурации виджета, как будто все в порядке, но это неверная конфигурация.

Что бы я хотел сделать: когда пользователь меняет Капитана, Корабль меняется на первый из доступных вариантов Корабля для этого выбранного Капитана. Я также в порядке, если Корабль пропадает (требуется выбор), или пользовательский интерфейс выдает запрос Корабля (ограниченный доступными параметрами), или почти что-нибудь еще, что предотвращает недопустимую комбинацию.

Есть ли способ вызвать программное изменение второго параметра на основе выбора первого?

Я не хочу отображать сообщение о недопустимой комбинации в виджете времени выполнения. Я полагаю, что моя резервная копия состоит в том, чтобы выбрать корабль для пользователя, если он сделал неверный выбор, но это не идеально.

Если это имеет значение, первый параметр в реальном виджете (Captain в моем примере выше) действительно динамический (массив строк, предоставляемых через API). Второй параметр (приведенный выше «Корабль») представляет собой фиксированный набор из трех вариантов, где любой один, два или все три могут применяться к любому из выбора первого параметра. Предполагается, что пользователь может создать несколько виджетов с разными конфигурациями.


person Mitch Cohen    schedule 01.12.2020    source источник


Ответы (1)


К сожалению, хорошего решения этой проблемы нет.

Возможный обходной путь - создать отдельные перечисления для каждого типа корабля. Это означает, что вместо Captain и Ship у вас будут Captain и (KirkShip, PicardShip, CrunchShip).

введите описание изображения здесь

Затем вам нужно отобразить их условно, указав parent parameter в разделе Relationship.

Это позволит вам отображать в пользовательском интерфейсе только соответствующие параметры:

введите описание изображения здесь

Вот конфигурация намерения:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Проблема с вышеуказанным подходом заключается в том, что вам необходимо вручную сопоставить перечисления намерений с моделями предметной области. Вот возможный пример:

enum Ship: String {
    case enterprise, galileo, voyager, cube // ...
    
    init?(_ ship: KirkShip) {
        switch ship {
        case .unknown:
            return nil
        case .enterprise:
            self = .enterprise
        case .galileo:
            self = .galileo
        }
    }

    // more inits...
}

Затем используйте соответствующие корабли на основе параметра configuration.captain:

if configuration.captain == .kirk {
    let ship = Ship(configuration.kirkShip)
    // ...
}
person pawello2222    schedule 24.02.2021