【发布时间】:2013-06-27 03:05:06
【问题描述】:
我在我的故事板中设置了这个 UIViewController,其中包含我需要的所有插座、视图和约束。完美的。我们称之为 WatchStateController,它将作为一个抽象父类。
然后,我有了 WatchStateController 的这个子类,称为 WatchStateTimeController,它将具有应用程序特定状态所需的功能。
因为我试图在 UIStoryboard 中使用 1 个视图控制器,所以在将 WatchStateTimeController 实例化为 WatchStateTimeController 类型时遇到了一些问题 - 它实例化为 WatchStateController。
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
WatchStateTimeController *timeController = (WatchStateTimeController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"WatchStateController"];
这是因为情节提要的 Identity Inspector 中的“Class”字段设置为“WatchStateController”。所以问题是,我如何在运行时更改 Identity Inspector 中设置的这个类名?
注意:忽略为什么我正在尝试这样做并专注于如何。如果您真的必须知道原因,可以阅读策略设计模式。
【问题讨论】:
-
考虑改变你对策略设计模式的解释以更好地适应故事板给你的应用程序结构的可能性:不要使用继承来改变视图控制器的行为,而是使用聚合.换句话说,在
WatchStateController上有一个属性,它引用了某个基类或协议类型的另一个对象,它可以作为一种委托提供所需的行为。 -
谢谢。我对聚合和组合非常熟悉——我 95% 的时间都在使用它。不幸的是,在这里使用它没有意义,它会导致重复工作,复制和粘贴相同的代码,这是我想要避免的。冗余是敌人。如果这是使用情节提要的限制,那么您是对的,必须找到模式的变体。问题是,在使用情节提要时,状态/策略模式是否完全兼容?还是我应该放弃并用一堆 IF/ELSE 语句乱扔代码(策略模式实际上是为了避免什么)
-
也许我读错了或者太快了,但是您包含的情节提要中显示 watchstatecontroller 的图像,并且您想要更改它...不应该是 WatchStateTimeController,因为您将其子类化,这是您想要的视图子类的?也许我可以使用一个更简单的描述......就像你有一个视图 a 的类,你将视图 b 的类 a 子类化,但你的问题是视图 b 正在与 a 类一起运行?
-
@PostCodeism 我建议的替代方案不应该导致比子类化视图控制器更多的重复代码/逻辑。您将如何确定在特定情况下使用
WatchStateController的哪个子类?无需更改控制器的子类,相同的代码只需将某个辅助对象的不同子类分配给控制器上的属性即可。WatchStateController中不需要条件逻辑。 -
好吧,对不起,如果我说的很明显,但你回答我说我之前问的是正确的,所以显然我明白我的下一个问题是如果你将它子类化,为什么你不能只使用从您发布的显示 WatchStateController 的情节提要图像上显示的类选择中下拉。如果您将 a 子类化为 b 类,那么您应该能够使用下拉菜单并为视图 b 选择 b 类。
标签: iphone ios uiviewcontroller storyboard