多态性和Cocoa NSViews+绑定



我目前正在为我的应用程序开发一个类似向导的功能,其中每个步骤模型类都是基本WizardStep类的子类。我现在只有三个(但永远都不到十几个)。

我有一个WizardController来后台实际的向导NSView,现在我面临着如何在UI中管理这个多态的WizardStep类的问题。请注意,我将为每个步骤子类广泛使用Cocoa绑定。

脑海中浮现出三种解决方案:

1) 为WizardStep的每个类型创建单独的NSView,然后创建相等数量的NSObjectController并在它们之间绑定特定的子类属性。当用户进入步骤时,我将填充NSObjectController的内容,并在向导视图中显示该视图(当然是子视图)。

2) 为WizardStep的每个类型创建单独的NSView,然后创建一个NSObjectController并将所有子类属性绑定到它(其中一些属性将不可用,具体取决于控制器内容的类型)。当用户进入步骤时,我将填充NSObjectController的内容,并在向导视图中显示该视图(当然是子视图)。

3) 创建一个NSTabView,每个类型的WizardStep都有一个选项卡,然后创建一个NSObjectController(或使用向导ViewController),并将所有子类属性绑定到它(其中一些子类属性将不可用,如解决方案2中所示)。当用户进入一个步骤时,我将填充NSObjectController的内容,并根据特定的步骤类型设置选项卡视图的selectedIndex属性。

我觉得解决方案1)是最正确、最优雅的,但我担心它可能是过度使用(许多NSObjectController,许多NSView)。解决方案2)和3)让我觉得很傻(因为不可用绑定)。

关于如何进行有什么建议吗?

谢谢大家,彼得·

我这样做的方法是创建一个对工作流中的所有步骤都有效(或至少不会引发)的模型类,其中一个属性指示当前步骤。然后,您可以将NSTabView绑定到currentStep属性,并将每个选项卡上的所有其他控件绑定到它们显示的属性。即使你已经走得太远了,不能放弃每步模型子类的方法,你也可以制作另一个模型对象,将多个步骤聚合到一个对象中。

这种方法意味着您有一个模型类,而不是X模型类、Y视图类和Z NSObjectController子类。FWIW,我很难想象为什么在这种情况下会对NSObjectController进行子类化,尽管从更广泛的意义上讲,有很多理由对NSView进行子类,但我不清楚在这种特定的情况下需要什么。

至于不可用的绑定,您可以为有时可能不可用的捆绑关闭"Raises for Not Applicable Keys"选项,但如果您喜欢在异常抛出时设置断点,这可能会很痛苦,因为关闭该选项并不能阻止抛出异常,它只会使控件吞下异常。

最新更新