关于使用多态显示 iPhone/iPad ViewControllers

Posted

技术标签:

【中文标题】关于使用多态显示 iPhone/iPad ViewControllers【英文标题】:On using polymorphism to display iPhone/iPad ViewControllers 【发布时间】:2014-02-23 18:09:49 【问题描述】:

在为 iPhone 和 iPad 应用程序开发通用二进制文件时,我注意到许多开发人员使用独特的 ViewController 并添加

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

分开他们的逻辑。我在 Apple 的 ios 文档中也看到过很多次。

但是,我真的不是这种方法的忠实拥护者,因为它会使代码变得混乱,并且难以维护,尤其是当 iPad 和 iPhone 的逻辑完全不同时。

所以我一直在考虑使用一个抽象的 ViewController 类并每次都为 iPhone 或 iPad 实例化一个特定的 ViewController(取决于平台)。然后,我将在每个 ViewController 转换中使用一个“if”,并且可以使用多态性来使代码更简洁。

这是推荐的做事方式吗?谢谢!

【问题讨论】:

【参考方案1】:

两种方式都行。这部分与个人偏好有关,部分与 2 个平台实现的不同之处有关。如果它们相似,那么您应该会发现需要条件代码的地方很少。同样,如果它们不同并且您选择使用不同的类,那么可能唯一的条件代码将是加载根视图控制器。之后,每个类都将是特定于平台的(或具有特定于平台的子类),因此通常会在那里处理特殊的逻辑和处理推送/呈现视图控制器。

【讨论】:

【参考方案2】:

实际上,如果您使用两个不同的故事板,则根本不需要“如果”。如果这是 iPad,您将加载一个主故事板,如果这是 iPhone,您将加载一个不同的主故事板(您在 info.plist 文件中设置)。现在,如果您愿意,您实际上可以拥有完全不同的视图控制器集(如果界面完全不同,那可能不是一个坏主意)。

我在这种情况下使用了子类化,但我总是觉得它非常混乱。这可能是子类化的问题!有更好的方法来表达通用代码(即在不同的类中,而不是在视图控制器中)。

【讨论】:

以上是关于关于使用多态显示 iPhone/iPad ViewControllers的主要内容,如果未能解决你的问题,请参考以下文章

仅 iPhone 应用程序中的 UIWebView 显示在 iPad 上

如何在 UIPickerView 上添加 UIToolbar? (iPhone/iPad)

应用程序因内存使用率非常低而崩溃 iphone/iPad

使用 plist 文件在 iPhone / iPad 上安装应用程序时如何正确显示图标和进度?

iPhone/iPad 上下文菜单

如何在 iphone/ipad 停靠栏中显示播放项目的详细信息?