2011-03-05 79 views
6

我正在写一个通用的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的普遍应用类这样的独立的公约 - 还是我(希望)缺少的东西,避免了这种必然性?

+0

Think Different的。 – drudge 2011-03-05 01:00:26

+0

Word :)所以 - 驱动程序是这样的......我想利用iPad的独特功能。我不想让iPhone的应用看起来像iPhone的只是bcs代码更容易管理。所以,没有任何假设,应用程序可能会看起来不同,行为也不同,并且具有不同的屏幕流/向导等 - 只是野兽的本质。我想我可以为这些类使用完全不同的名称,甚至不尝试在类名中标识常用功能...... – 2011-03-06 17:00:48

回答

1

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

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

+0

是的 - 这绝对是我的出发点。只是不确定是否有一个标准的做法,当你有一个EditorView ......这两个平台之间的差异很大(iPhone可能使用UITableView,而iPad可能使用自定义XIB,所有字段都像表单一样放置)。 – 2011-03-06 16:57:56

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个表格,则可以实例化每个表格控制器,并且所有代码均可重复使用。

+0

我担心iPad的细节视图这样的用例最终会与iPhone的细节视图大不相同。我经常在iPhone上使用UITableView作为编辑器模板 - 但我通常不会在iPad上这样做。管理一个UITableView的逻辑将会疯狂地推入一个View Controller中,该控制器还管理用于iPad的大屏幕XIB编辑器的逻辑。要充分利用iPad的大屏幕 - 我常常会得到非常不同的逻辑和屏幕流。重复使用与您所描述的相同的类并不总是很干净。 – 2011-03-06 16:54:46

+0

首先,我从来没有把我的表数据源和委托代码放到视图控制器中。我发现这只是等待发生的痛苦。打破数据源并委托出一个单独的类。是的,有时功能是非常不同的。如果是这样,我将制作两个IBAction方法,并将一个绑定到iPhone xib,另一个绑定到iPad xib。这些方法中的功能仍然无疑会共享一些位,并且我确保将它们分解为单独的方法,以便可以从两种IBAction方法中调用它们。 – 2011-03-06 18:22:16

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];