多态性和Cocoa NSViews +绑定

时间:2012-09-27 08:15:51

标签: objective-c cocoa polymorphism cocoa-bindings nsviewcontroller

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

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

我想到了三种解决方案:

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

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

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

我觉得解决方案1)是最正确和优雅但我担心它可能是 overkill (很多NSObjectController,很多NSView)。解决方案2)和3)对我来说感觉很愚蠢(因为不可用的绑定)。

关于如何进行的任何建议?

谢谢大家,彼得

1 个答案:

答案 0 :(得分:1)

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

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

对于不可用的绑定,您可以关闭&#34;提高不适用的键&#34;对于有时可能不可用的绑定,但如果您希望在异常抛出时有一个断点,这可能会很痛苦,因为关闭该选项并不会阻止抛出异常,它只会使控件吞下异常。