根据UI_USER_INTERFACE_IDIOM有条件地呈现不同的笔尖

时间:2011-06-22 21:54:27

标签: ios nib idioms viewcontroller

我正在将应用升级为Universal。我有一组nib来显示一个视图控制器(我们称之为DetailViewController,它是特定于iPhone和iPad的。

因为我支持的设备是< iOS 4.0我不能只依赖于使用~iPad后缀来为nib添加正确的DetailViewController nib,所以我有一个方法可以加载基于nibs的UI_USER_INTERFACE_IDIOM测试。这工作除了但是它变得更复杂,因为我从两个不同的源控制器呈现这个视图控制器:一个是表,另一个是带有按钮的图形图表,用于调用视图控制器,细节视图的格式基于不同哪个视图控制器调用它所以我有两组不同的nib,即使DetailViewController的接口和实现文件是相同的。

为了逐步测试,我有一个方法来进行测试:

- (BOOL)loadNibFileForIdiom

{     NSArray * topLevelObjs = nil;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"DetailViewController~iPad" owner:self options:nil];
    if (topLevelObjs == nil)
    {
        NSLog(@"Error! Could not load myNib file.\n");
        return NO;
    }
    return YES;
}
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    topLevelObjs = [[NSBundle mainBundle] loadNibNamed:@"DetailViewController" owner:self options:nil];
    if (topLevelObjs == nil)
    {
        NSLog(@"Error! Could not load myNib file.\n");
        return NO;
    }
    return YES;
}
return NO;

}

正如我所说,当在详细控制器的viewWillAppear中调用该方法时,这种方法工作正常,并且该视图控制器是从表视图控制器推送的,该控制器实际上是从标签栏项调用的。请注意,ChartViewController也是标签栏上的第一个项目。

为了从表或图表中调用时加载替代的nib,我试图在这个方法中添加一个条件测试,包含上面的代码:

if (self.parentViewController == TableViewController) { ... do idiom tests and load appropriate nib for DetailViewController or DetailViewController~iPad nib }

if (self.parentViewController == ChartViewController) { ... do idiom tests and load appropriate nib for DetailViewController2 or DetailViewController2~iPad nib }

...但是在进行这些测试时,为哪个视图控制器推送了细节控制器,它们不会被评估为true,并且不会运行成语测试,因此不会加载这些nib。

我可能做错了什么或者确定调用详细控制器的控制器的有效方法是什么,以便我可以加载正确的笔尖?

1 个答案:

答案 0 :(得分:0)

虽然我仍然不确定如何解决这个问题,因为我试图对其进行编码,我通过在我的数据模型中添加一个标志来开发一种解决方法,这表明哪个源控制器正在传递数据到细节控制器,然后将我的习语测试基于该标志的状态。