WidgetKit 配置,一个参数基于另一个参数的选择

Mit*_*hen 4 ios swift widgetkit

我正在开发一个带有两个动态参数的 WidgetKit 小部件。其中一个参数仅限于第一个参数允许的选项。假设第一个是船长,第二个是船长的船。允许的配置可能是(忽略佳能):

Captains: [Kirk, Picard, Crunch]
Captain: Kirk, Ship: [Enterprise, Galileo]
Captain: Picard, Ship: [Enterprise, Voyager, Cube]
Captain: Crunch, Ship: [Sugar, Berry, Chocula]
Run Code Online (Sandbox Code Playgroud)

我有逻辑工作。例如,如果用户选择 Picard,然后点击“发货”按钮,则只有 Enterprise、Voyager 和 Cube 可用选项。然后,用户可以选择其中一艘飞船(例如 Cube),一切都很好。

然而,当船长更换时,船舶选项不会改变或重置。假设经过上述设置后,用户将队长更改为柯克。飞船仍设置为立方体。用户可以退出小部件的配置,就好像一切都很好,但这是一个无效的配置。

我希望发生的情况:当用户更改船长时,船舶将更改为所选船长的第一个可用船舶选项。如果飞船空白(需要选择),或者用户界面强制提示飞船(受可用选项限制),或者几乎任何其他阻止无效组合的东西,我也很好。

有没有办法根据第一个参数的选择触发对第二个参数的编程更改?

我不想运行时小部件中显示“无效组合”消息。我想我的备份是在用户做出无效选择的情况下为他们选择一艘船,但这并不理想。

如果重要的话,真正的 Widget 中的第一个参数(上面示例中的 Captain)是真正动态的(通过 API 提供的字符串数组)。第二个参数(上面的 Ship)是一组固定的三个选项,其中任何一个、两个或全部三个都可以应用于第一个参数的任何选择。预计用户可以创建具有不同配置的多个小部件。

paw*_*222 10

不幸的是,这个问题没有好的解决方案。

一种可能的解决方法是为每种船舶类型创建单独的枚举。这意味着您将拥有and ( , , ) 而不是Captainand 。ShipCaptainKirkShipPicardShipCrunchShip

在此输入图像描述

然后您需要通过parent parameter在该Relationship部分中定义来有条件地显示它们。

这将允许您在 UI 上仅显示相关参数:

在此输入图像描述

这是意图配置:

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

在此输入图像描述

上述方法的问题是您需要手动将意图枚举映射到域模型。这是一个可能的例子:

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...
}
Run Code Online (Sandbox Code Playgroud)

然后根据configuration.captain参数使用相关船舶:

if configuration.captain == .kirk {
    let ship = Ship(configuration.kirkShip)
    // ...
}
Run Code Online (Sandbox Code Playgroud)