2009-06-04 48 views
18

我已经遇到过这两次了。呈现模态视图偶尔隐藏导航栏

有时使用下面的代码行:

[self.navigationController presentModalViewController:aViewController animated:YES]; 

显示视图,但然后隐藏导航栏。

我可以这样写:

[self.navigationController setNavigationBarHidden:NO]; 

我的心的内容,无论我能想到的,没有效果。

有没有人遇到过这个?

我在做些傻事吗?

回答

38

不,我也碰到过这个。问题在于,当您使用基于UIViewController的类呈现模态视图控制器时,它不会将调用导航控制器的导航栏扩展到模态上。模态视图覆盖整个屏幕。我最终做的解决问题的方法是创建一个UINavigationController并将基于UIViewController的类推到它上面,然后将presentModalViewController放到导航控制器的实例中。

喜欢:

UIViewController *vc = [[UIViewController alloc] init]; 
UINavigationController *cntrol = [[UINavigationController alloc] initWithRootViewController:vc]; 
[self presentModalViewController:cntrol animated:YES]; 
[cntrol release]; 

,让我有在顶部的导航栏。

我不确定这是否会对您的特定情况有所帮助,我建议的唯一的另一件事是用UIAnimation复制模式的行为,该UIAnimation停止在手机顶部以下44px。这将保持原始导航栏可见。

+1

哦,我很愚蠢。我不需要顶部的导航控制器,只需一个工具栏,任何工具栏。谢谢 – 2009-06-04 01:05:49

+0

顺便说一句,谢谢你在过去5个小时里把那首歌放在脑海里。我觉得这是圣诞节。 – 2009-06-04 06:01:39

1

也许这是显而易见的,但一旦你与模态视图做,想关闭它,你应该做这样的事情在你的模式VC:

[parentController dismissModalViewControllerAnimated:YES];

其中parentController是从您展示模态视图的vc的引用。

2

@HeatMiser显示了一个很好的方式来解决无法在导航栏上显示项目的“bug”。不过,我不确定这是否严格是Presentation中的一个bug,因为模态操作应该胜过底层视图的界面主题。模态操作的主题模仿底层UI主题是好的,但用导航视图包装真正的模态视图对我来说是错误的(额外的视图对象只是为了获得更多的行为)。

取而代之,以下代码适用于我,并且在邮件程序(在iPhone上)中提供与“新邮件”相同的行为。

在IB中,通过“取消”和“保存”UIBarButtonItem和一个灵活的空格键按钮项之间放置一个UIToolBar在模态屏幕的顶部(模仿导航栏),让按钮左右对齐。然后,添加一个以UIToolBar为中心的UILabel(字体Helvetica,粗体,大小18似乎与导航栏标题相匹配)。将按钮连接到模式的UIViewController上的IBAction,就完成了。

1

如果有一个导航控制器活动,那么你应该只使用

[self.navigationController pushViewControllerAnimated:如何]

滑动另一个视图控制器,同时让自己和用户进入一个一致的用户界面,并带有“自动”后退按钮支持。

一旦使用导航控制器,应该只显示一个模态视图控制器来放大屏幕上的可用区域。然后,你应该真的使用一个奇特的动画让用户知道你正在离开导航控制器所体现的“任务”或“步骤”。