7

我正在编写一个通用 iOS 应用程序(iPad 和 iPhone),发现自己的类名称很长,无法在两个应用程序之间共享:

FamilyViewController_iPhone.h/m
FamilyViewControllerA_iPad.h/m

DetailViewControllerB_iPhone.h/m
DetailViewControllerB_iPad.h/m

同样,这些家伙内部的类具有完整的名称(包括设备),主要是为了 Interface Builder 可以轻松使用它们。

我考虑过 AControllerA.h 和 BControllerA.h 之类的东西,其中 A=iPhone 和 B=iPad,但也对该选项不感兴趣。

在 iOS 通用应用程序中,这样的类的常规约定是什么——或者我(希望)错过了一些可以避免这种必要性的东西?

4

3 回答 3

4

我认为通过这样分离你的功能,你会走上一条糟糕的道路。虽然 iPad 应用程序显然可以具有与您的 iPhone 应用程序不同的 UI 结构和设计,但最好还是尽量保持抽象。

我避免在我的视图控制器中使用平台名称。我有:

FamilyViewController.h
FamilyViewController.m
FamilyViewController.xib (which is used for the iPad UI)
FamilyViewController~iphone.xib

iPhone 和 iPad 的功能很可能会非常相似,或者如果不一样,您仍然会有很多重叠之处。

我也从不让我的视图控制器充当我的表控制器。我将该功能保存在单独的对象中。这样,如果 iPhone 应用程序在不同的屏幕上有 2 或 3 个表格,但 iPad 在同一个屏幕上显示所有 3 个表格,您可以实例化每个表格控制器,并且所有代码都是可重用的。

于 2011-03-05T04:37:16.910 回答
2

如果您想将同一类 YourClass 与 YourClass.xib 和 YourClass-iPad.xib 一起使用,请查看我使用的这个宏:

#define getXIB(s) ( (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) ? @"" #s "-iPad" :@"" #s )

因此,您可以使用类本身来获取正确的 XIB 文件:

YourClass * viewController = [[YourClass alloc] initWithNibName:getXIB(YourClass) bundle:nil];
于 2011-07-27T20:34:45.840 回答
1

我不确定是否有标准的方法来处理这个问题。

一种可能性是使用类集群策略。如果 FamilyViewController_iPad 和 FamilyViewController_iPhone 非常相似,则将它们设为抽象 FamilyViewController 类的子类。设置 FamilyViewController 的 -initWithNibName:bundle: 方法,使其返回 ...iPad 或 ...iPhone 版本的实例,具体取决于运行应用程序的设备。那么,在您的大部分代码中,您将只处理 FamilyViewController。当然,您仍然需要在您的 nib 中使用子类名称,但至少您的代码会更易于阅读。

于 2011-03-05T03:01:05.733 回答