如何在 UIPopOverController 中嵌套 navigationController?

Posted

技术标签:

【中文标题】如何在 UIPopOverController 中嵌套 navigationController?【英文标题】:How to nest a navigationController inside of a UIPopOverController? 【发布时间】:2011-04-28 01:19:42 【问题描述】:

实际上有三种观点在起作用。我的 homeView,这是我启动选择器的地方,它将 StudyPickerController 视图设置为根到 navController,然后在 popOverController 中呈现。然后从 StudyPickerController 视图中,我需要推送到 ScreenPickerController,完全不同的视图。

我有一个 UIPopOverController,它显示一个 tableView 视图的内容。我希望能够在该视图中使用 viewController 推送一个新视图,但正如我将要讨论的,它真的很接近,但它不会推送!

所以在我的 homeView 中,当按下按钮时,会调用一个动作并运行此代码:

self.studyPicker = [[[StudyPickerController alloc] initWithStudyArray:self.studyArray ViewNum:butto.tag] autorelease];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.studyPicker];   

_studyPicker.delegate = self;
self.studyPickerPopover = [[[UIPopoverController alloc] initWithContentViewController:navController] autorelease];               

[self.studyPickerPopover presentPopoverFromRect:CGRectMake(120,45, 10,10) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

这很好用! popOverController 显示我的 StudyPickerController 的内容没有任何问题。我觉得我确实可以访问我的 navigationController,因为 popOverController 的框架在顶部有一个栏,而不只是一个细边框,它有一个 navigationBar。

所以现在当我想在这个视图中选择一行时,我想用我的 navigationController 推送到一个新视图,也有一个 tableView。这是代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    NSArray * array = [_studyArray objectAtIndex:indexPath.row];

    ScreenPickerController * picker = [[ScreenPickerController alloc] init];
    picker.seriesGUID = array;
    picker.viewNumber = viewNumber;

    [self.navigationController pushViewController:picker animated:YES];

在我看来,这应该可行!但是,唉,我按了一行,它突出显示,没有任何反应。

我整天都在做这个,所以很可能我只是错过了一些东西,但我不知道它是什么。任何帮助表示赞赏

【问题讨论】:

您确定应该执行 [[ScreenPickerController alloc] init] 而不是从 nib 文件加载控制器吗?顺便说一句,正如它所写的那样,您通过不释放/自动释放它来泄漏选择器。 恐怕我没跟上。 ScreenPickerController 是一个 UIViewController,它有一个与之关联的 nib 文件,我怎么能做得与我所拥有的不同? 类似 [[ScreenPickerController alloc] initWithNibName:@"ScreenPickerController" bundle:nil]; 感谢 cmets。我把它放在那里,但没有运气...... init 默认会选择同名的 xib 文件。对其进行测试,然后重构您的代码以删除 xib 名称! 【参考方案1】:

这里似乎涉及两个类:homeView 类和 StudyPickerController。我猜tableView:didSelectRowAtIndexPath: 方法会在 homeView 类中?

在这种情况下,self.navigationController 正在尝试访问 homeView 所在的导航控制器,不是您放入弹出框的导航控制器。由于 homeView 甚至不在导航控制器中,因此访问器返回 nil。

相反,您会想要使用 [self.studyPicker.navigationController pushViewController:picker animated:YES]; 之类的东西。

【讨论】:

好吧,你的想法是对的。而不是自己。我做的超级棒。它奏效了!

以上是关于如何在 UIPopOverController 中嵌套 navigationController?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS7 的 UIPopoverController 中更改导航栏背景/颜色?

如何在 iOS7 的 UIPopoverController 中禁用较暗的透明效果?

UIPopoverController,如何改变它的大小呢?

如何使用 iOS 状态恢复来恢复 UIPopoverController?

如何在 UIPopoverController 上创建按钮 [关闭]

在 UIPopoverController 中显示 UItableViewController