Storyboard ViewControllers 中的多态性

Posted

技术标签:

【中文标题】Storyboard ViewControllers 中的多态性【英文标题】:Polymorphism in Storyboard ViewControllers 【发布时间】:2013-07-29 13:10:01 【问题描述】:

我想知道如何在 iPhone XCode 故事板 ViewControllers 中实现多态性。

这是我的问题: 我的应用程序中的两个不同的 ViewController 正在连接到一个通用的 ViewController。

这个常见的 ViewController 的行为取决于它所来自的 VC - 执行不同的远程 API 服务器调用和 CoreData 获取(首先它在表中显示所有用户,对于另一个它显示管理员列表 - 子类的用户,我可能会有第三个显示过滤的用户列表)。

这个常见的 ViewController 在我的应用程序中非常重要,并且与许多其他 ViewController 相衔接。因此,在我看来,用子类在 stroyboard 上复制它是不对的。

不幸的是,将用户列表传递给 ViewController 不太可行,因为在此列表上的不同搜索是在 ViewController 方法中执行和实现的。

通过子类化和使用多态性来实现这些不同的行为是有意义的,并根据源segue为情节提要中的 ViewController 分配子类。

有没有办法在转场时动态设置 Storyboard ViewController 类?

【问题讨论】:

我看不出有任何理由在你的公共视图控制器中添加一个属性来确定你从哪个 uiviewcontroller 开始,然后进行适当的调用。 @mstfbsnli 我明白你的意思,但我正在寻找更精简的类和更简洁的代码解决方案。我试图避免不同 VC 方法的 if-else if-else 条件 【参考方案1】:

执行不同的远程 API 服务器调用和 CoreData 提取

您在这里真正要强调的是数据接口与视图接口不同。没关系。您应该拉出一个负责获取数据的单独对象。您可以将该对象传递给视图控制器,而不是对视图控制器进行多态化。这称为策略模式,在 Cocoa 中很常见。

这与委托几乎相同,您也可以在此处使用。当您进行 segue 时,调用视图控制器会在接收视图控制器上设置一个委托。然后该委托负责返回数据对象,再次将接收视图控制器从多态中释放出来。

【讨论】:

这个答案很好,我将实现这种方法,但我明白在同样的意义上 - 没有办法动态设置 ViewController 类。我说的对吗? 当然有办法 :) 对于这类问题,这不是一个好主意。您可以在运行时将接收类转换为不同的类。但这将是一个糟糕的主意。如果你犯了任何错误(比如在子类中添加一个 ivar;我犯过一次),那么 Isa-swizzling 会导致非常惊人的错误。 欲了解更多信息:developer.apple.com/library/ios/featuredarticles/… 知道了。我会采用你的方法。用策略模式刷新我的想法似乎是正确的解决方案。

以上是关于Storyboard ViewControllers 中的多态性的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ViewController.swift 连接到 Storyboard 中的 ViewController?

将 ViewController 嵌入 Storyboard 中的另一个 ViewController

如何将一个 Storyboard 的 ContainerView 链接到另一个 Storyboard 中的 ViewController?

Storyboard - 在 Storyboard 中为同一个 ViewController 创建两个不同的视图

从 Storyboard 中获取 ViewController

修改 Storyboard 后 ViewController 死循环