2

在为 iPhone 和 iPad 开发通用应用程序时,我们经常重复使用相同的视图控制器。但经常需要进行一些自定义,例如:

IF iPad THEN 
  ...
ELSE
  ...

因此,为了实现这种自定义,控制器可能具有在控制器初始化期间设置的某些属性,或者可能存在自定义构造函数。只是好奇是否有适合这种情况的设计模式。

4

3 回答 3

4

不要.... :) 使用一个名为 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]];
}
于 2012-12-14T15:21:48.793 回答
1

如果您有不同的初始化程序或更大的不同功能块,那么定义一个具有核心功能的基类,然后定义一个特定于 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用于基类中的微不足道的差异。

于 2012-12-14T15:31:45.520 回答
1

如果您需要在 N 个地方使用相同的 VC,但每次初始化都略有不同,我会将逻辑移动到 VC 上的特定工厂类/类别中

就像它用例如SLRequest 对象 / 在 ShareKit 中完成的一样

于 2012-12-14T15:34:38.850 回答