iPhone 视图层次结构问题:如何在选项卡栏上方绘制视图?

3

我在iPhone上的视图层次结构和绘制方面遇到了一些问题。

更具体地说,我有一个选项卡应用程序,其中包含一个表视图,我希望选择特定单元格时会出现UIPickerView。滑动不是问题(或者至少我假设一旦我解决了这个问题就不是问题了),但是我似乎无法让picker(或任何UIView)显示在选项卡栏上方。

我认为我设置这个特定选项卡的方式可能是问题所在。通常,在任何其他选项卡中,我可以像这样做:

[self.tabBarController.view addSubview:pickerView];

一切都可以正常工作。

但是对于这个特定的选项卡,我在导航栏中有一个UISegmentedControl,可以在两个不同的UITableView之间切换。因此,与该选项卡关联的视图控制器(称为TabViewController)具有其自己的这两个表视图控制器的实例(TableOneViewController和TableTwoViewController),并将当前选择的表视图(基于分段控件)插入为TabViewController视图的子视图。

如果我不需要像这样切换视图,我可以直接调用

[tabViewController.tabBarController.view addSubview:pickerView];

我想从TabViewController中调用选择器,并且选择器会显示在选项卡栏上方。但问题是,我不能在此选项卡中选择的任何一个表视图控制器中调用它(好吧,我可以,但它什么也不做)。我尝试将这个tabBarController属性传递到表视图控制器中,但那也不起作用。我还尝试过在应用程序委托中进行更改(我正在尝试避免这样做),但没有成功。

我是否遗漏了一些简单的东西,或者这不能完成?我感觉应该可以,因为在此表视图中键盘可以滑动到选项卡栏上方。是否有一种方法可以覆盖所有当前的视图和子视图?

以下是当在TabViewController.m中选择分段控件并切换视图时调用的内容:

- (IBAction)switchViews:(id)sender
{
    if (self.tableOneViewController.view.superview == nil)
    {
        if (self.tableOneViewController == nil)
        {
            TableOneViewController *tempOneController = [[TableOneViewController alloc] initWithNibName:@"TableOneViewController" bundle:nil];
            self.tableOneViewController = tempOneController;
            [tempOneController release];
        }
        [tableTwoViewController.view removeFromSuperview];
        [self.view insertSubview:tableOneViewController.view atIndex:0];
    }
    else
    {
        if (self.tableTwoViewController == nil)
        {
            TableTwoViewController * tempOneController = [[TableTwoViewController alloc] initWithNibName:@"TableTwoViewController" bundle:nil];
            self.tableTwoViewController = tempOneController;
            [tempOneController release];
        }
        [tableOneViewController.view removeFromSuperview];
        [self.view insertSubview:tableTwoViewController.view atIndex:0];
    }
}

当我尝试在TableOneViewController.m中添加选择器时,发生了以下情况:

UIPickerView *tempPicker = [[UIPickerView alloc] init];
tempPicker.delegate = self;
tempPicker.dataSource = self;
tempPicker.showsSelectionIndicator = YES;
tempPicker.clipsToBounds = NO; // thought this might work, but doesn't
self.picker = tempPicker;
[tempPicker release];
[self.view addSubview:pickerPicker]; // adds beneath tab bar!
2个回答

7
[[[UIApplication sharedApplication] keyWindow] addSubview:someViewController];

确保您加载的viewController高度为480像素!

要将其再次移除,请使用[someViewController removeFromSuperview];


这正是我在寻找的。谢谢你的建议。我知道我的帖子至少有点啰嗦。解决方案竟然是如此简单,这真让人傻眼! - Kevin
你也可以添加一个简单的动画效果,这样它不会只是突然出现 :) - Emil

2
也许您只想做以下事情:
[tabBarController presentModalViewController:someViewController animated:YES];

这应该滑动到屏幕上的任何其他内容之上。


我没有完整地阅读这篇文章...但是Jaanus的回答可能是你想要的。 - Ryan Ferretti
谢谢你的建议。我也考虑过这个选项,但是我没能让它工作。可能是我做错了一些小事情... - Kevin
presentModalViewController是一个标准易调用的方法,也是显示内容在其他内容上方的推荐方式。 - Jaanus
只是为了跟进一下,对于那些想知道的人...在研究我的模态视图控制器问题时,我遇到了另一个线程,指出模态视图控制器仅在动画中是透明的,并且一旦放置后就变得不透明。这对我个人来说是使用它的问题,因为我希望底部的视图也能被看到。 - Kevin
“模态视图控制器在动画中仅为透明,在到位后变为不透明”听起来是虚假的。视图控制器本身不能成为任何形式,它们“封装”的视图可以是透明或不透明的。您可以在代码或Interface Builder中配置视图透明度。 - Jaanus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接