在条件内声明类的对象

时间:2014-07-23 12:45:09

标签: ios objective-c

我的要求是我想根据deviceFamily是iPad或iPhone的条件声明一个类的对象。 我开发了一个iPhone应用程序。现在我想为iPad开发相同的应用程序。现在,我希望为iPhone和iPad提供两个不同名称的.h.m.xib。但我想在AppDelegate类通用应用程序中使用两个不同类的相同名称对象。

.h文件中的内容:

if(IS_iPad)
{
 ViewController_iPad * obj;
}
else
{
 ViewController_iPhone * obj;
}

所以我可以在整个应用程序中使用相同的对象名称。

我怎样才能做到这一点。救命啊!

3 个答案:

答案 0 :(得分:4)

这可能是创建“环球”的最佳方法。应用程序(包括iPad和iPhone),但对于我已经看到采用这种模式的所有实例,他们似乎都采用了关于控制器的链条逻辑......

UIViewController * sharedController = [[UIViewController alloc] init]; //两个设备共享的东西都在这里(写一次没有重复)

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) // PAD
{
    ViewController_iPad * obj;
}
else if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) // PHONE
{
    ViewController_iPhone * obj;
}

上面的两个视图控制器应该包含sharedController作为属性来使用那里的代码或更好...

使sharedController成为'基类'。然后制作此类的ViewController_iPad和ViewController_iPhone子类(共享)。

为此,在ViewController_iPhone和ViewController_iPad的.h头文件中,将它们设置为sharedController的子类,如下所示。

@interface ViewController_iPad:sharedController

如果你真的必须这样做,那就是一种方法。

答案 1 :(得分:2)

我会按照iOS7 Tech Talks中的说明研究类群。在第120页开始的幻灯片中查看会话结束“构建现代应用程序,第2部分”。

基本上,您可以从使用它的其他类中隐藏类的确切实现。在下图中,应用程序使用“下载控制器”类,但不需要知道操作系统是否能够NSURLSession或需要默认为NSURLConnection。我认为这种模式可以很好地解决您的问题。

enter image description here

两个这样的实现的代码看起来像这样:

@interface MyViewController_iPhone : MyViewController @end 
@interface MyViewController_iPad   : MyViewController @end 

@implementation MyViewController

+ (instancetype)newViewController {
   if (IS_iPad) {
     return [[MyViewController_iPad alloc] init];
   } else {
     return [[MyViewController_iPhone alloc] init];
   } 
}
... 
@end

答案 2 :(得分:0)

也许我现在明白你想要实现的目标:你想要另外定义不同的对象,但是在声明范围之外以相同的名称访问它们。如果是这样,那么:

@property (strong) UIViewController *obj;
... 
if(IS_iPad)
{
 obj = [[ViewController_iPad alloc] initWithNibName:nibName bundle:nil];
}
else
{
 obj = [[ViewController_iPhone alloc] initWithNibName:nibName bundle:nil];
}

我假设这两个类都是UIViewController的子类,因此赋值可以。当然,必须对视图控制器使用正确的初始化。