我的要求是我想根据deviceFamily是iPad或iPhone的条件声明一个类的对象。
我开发了一个iPhone应用程序。现在我想为iPad开发相同的应用程序。现在,我希望为iPhone和iPad提供两个不同名称的.h
,.m
和.xib
。但我想在AppDelegate
类通用应用程序中使用两个不同类的相同名称对象。
.h
文件中的内容:
if(IS_iPad)
{
ViewController_iPad * obj;
}
else
{
ViewController_iPhone * obj;
}
所以我可以在整个应用程序中使用相同的对象名称。
我怎样才能做到这一点。救命啊!
答案 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
。我认为这种模式可以很好地解决您的问题。
两个这样的实现的代码看起来像这样:
@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
的子类,因此赋值可以。当然,必须对视图控制器使用正确的初始化。