我现在遇到很多麻烦让我的导航栏正常工作。以下是我的等级。
TabBarController
-- NavigationController
-- View
-- Navigation Controller
-- View
-- Navigation Controller
-- View
我有一个抽象类,我从每个标签栏视图继承。此抽象类设置为NavigationBar委托,并具有导航栏iboutlet。
在我的一个视图中,我设置了一个表视图,当有人选择表视图时,我希望它能够进入更详细的视图。以下是我用来做的代码。当我设置xib时,我将一个NavigationBar拖到视图上,然后将ViewController的“VisitedPlace”设置为导航栏的委托。
// Called when a row in the table view has been selected.
// This method will change the view to the current place detailed view
- (void) tableView:(UITableView *) tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath {
NSLog(@"We are here, and proud of it I suppose~");
PlaceViewController *placeView = [[PlaceViewController alloc] initWithNibName:@"PlaceView" bundle:[NSBundle mainBundle]];
[self.navigationController pushViewController:placeView animated:YES];
[placeView release];
placeView = nil;
}
当我选择行时,会打印日志消息,但不会发生任何事情。
此刻我很迷茫,我必须错过一些关键。我正在阅读有关NavigationController以及我如何实现它的信息,但说实话,我不知道该怎么做。
编辑: 当我NSLog的self.navigationController它是零时,我拖动一个NavigatonController并将Delegate设置为VisitedPlaces的文件所有者。但是,导航控制器仍然是零。
非常感谢任何帮助!!
答案 0 :(得分:1)
问题顶部的层次结构显示了导航控制器,但之后您描述了在界面构建器中将导航栏拖动到视图中。我认为你混淆了这两件事。您正在向现有视图添加导航栏,但导航栏只是一个UIView子类。将它添加到视图中也不会创建导航控制器(UIViewController子类),因此这就是为什么你的self.navigationController属性为nil,以及为什么在将推送消息发送到该属性时没有任何反应。< / p>
首先,您应该阅读MVC(模型,视图,控制器)设计模式(如果您还没有),因为视图和控制器之间的区别是您需要了解的。
UINavigationControllers不会直接显示太多内容。他们所做的只是管理一堆其他UIViewControllers。 UINavigationBar是UIViewController直接显示的唯一视图。当您告诉导航控制器将视图控制器推入堆栈时,导航控制器会相应地更改导航栏并在屏幕上为新视图控制器的视图设置动画。 UINavigationBar只是一个由导航控制器管理的愚蠢的UIView。它本身并不包含管理视图控制器堆栈的任何功能(这应该是MVC方法的明显假设,因此我的建议如上所述)。
在某处,无论是在界面构建器中还是在您的代码中(我更喜欢后者),您都需要创建一个UINavigationController。实际上,您需要为标签栏中的每个选项卡创建一个。将UITabBarController的viewControllers
属性设置为这些navigationcontrollers的数组。
然后,需要为每个导航控制器提供一个视图控制器以显示为他们的第一个项目。您可以通过将导航控制器的rootViewController
属性设置为要在导航控制器堆栈顶部显示的视图控制器来执行此操作。
修改强>
仅供参考,有时你可能想要在没有导航控制器的情况下使用UINavigationBar。如果您正在实现自己的系统来跟踪视图控制器并在屏幕上和屏幕外设置动画,那就是这样。 UITabBar也是如此,这个视图不应该与具有类似名称的视图控制器混淆。
答案 1 :(得分:0)
调试并检查self
是否指向visitedPlaced对象