在为 iPhone 和 iPad 开发通用应用程序时,我们经常重复使用相同的视图控制器。但经常需要进行一些自定义,例如:
IF iPad THEN
...
ELSE
...
因此,为了实现这种自定义,控制器可能具有在控制器初始化期间设置的某些属性,或者可能存在自定义构造函数。只是好奇是否有适合这种情况的设计模式。
在为 iPhone 和 iPad 开发通用应用程序时,我们经常重复使用相同的视图控制器。但经常需要进行一些自定义,例如:
IF iPad THEN
...
ELSE
...
因此,为了实现这种自定义,控制器可能具有在控制器初始化期间设置的某些属性,或者可能存在自定义构造函数。只是好奇是否有适合这种情况的设计模式。
不要.... :) 使用一个名为 instance 的通用类MyClass
,然后将其子类MyClass-iPad
&MyClass-iPhone
并为每个类使用两个不同的 XIB。避免使用这种东西(没有必要)。
解释:
iPad 版本应该只知道Something-iPad
使代码干净并创建良好定义的体系结构的类型的类。如果我跳入您的代码并且有人告诉我:“好的 Jacky Boy,您必须在 iPad 版本上进行更改”。我不会在意看Something-iPhone
课。大多数逻辑(业务)应该在超类Something
上,而小调整应该在子类上。
附带说明一下,在我的大多数项目中,通常我没有任何Something-iPhone
课程,因为设计是在 XIB 上完成的。在Something-iPad
我通常会保留一个参考UIPopOverController
(只是一个例子)和一些旋转调整。
编辑1:
我会NSDictionary
在初始化时收到一个UIViewController
,如下所示:
initWithNibName:bundle:configurationDictionary:
收到这个配置字典后,我会在viewDidLoad
(例如)上使用它。然后你可以做一些像这样很酷的事情:
- (void)viewDidLoad
{
[[self view] setBackgroundColor:[[self configurationDictionary] objectForKey:BACKGROUND_COLOR_KEY]];
}
如果您有不同的初始化程序或更大的不同功能块,那么定义一个具有核心功能的基类,然后定义一个特定于 iPad 的子类和一个特定于 iPhone 的子类是有意义的。
但是如果你只有一个微不足道的区别(例如,显示一个操作表),那么我会简单地使用类似的东西:
- (void)someMethod {
// a bunch of stuff that is the same
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// one or two lines for iPad
} else {
// one or two lines for iPhone
}
}
我有很多情况我都这样做 - 子类用于更大的差异并UI_USER_INTERFACE_IDIOM
用于基类中的微不足道的差异。
如果您需要在 N 个地方使用相同的 VC,但每次初始化都略有不同,我会将逻辑移动到 VC 上的特定工厂类/类别中
就像它用例如SLRequest 对象 / 在 ShareKit 中完成的一样