【问题标题】:UI Tab Bar and Navigation Bar to Detail ViewUI 选项卡栏和导航栏到详细信息视图
【发布时间】:2010-12-05 02:00:00
【问题描述】:

我现在很难让导航栏正常工作。以下是我的层次结构。

TabBarController
  -- NavigationController
    -- View
  -- Navigation Controller
    -- View
  -- Navigation Controller
    -- View

我为每个标签栏视图继承了一个抽象类。此抽象类设置为 NavigationBar 委托,并具有导航栏 iboutlet。

在我的一个视图中,我设置了一个表格视图,当有人选择表格视图时,我希望它转到更详细的视图。以下是我用来执行此操作的代码。当我设置 xib 时,我将 NavigationBar 拖到视图上,然后将“VisitedPlace”的 ViewController 设置为导航栏的委托。

//  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'd self.navigationController 它是 nil 时,我拖了一个 NavigatonController 并将 Delegate 设置为 VisitedPlaces 的文件所有者。但是,导航控制器仍然为零。

任何帮助将不胜感激!

【问题讨论】:

  • 验证 self.navigationController 不是 nil
  • 它是零。我已将导航控制器拖入 VisitedPLaces.xib。我希望导航栏在标签栏仍在原位时推送和弹出视图。
  • 我实际上发现了我做错了什么,我看了 Orielly 的一个非常好的教程,你可以在这里找到它:youtube.com/watch?v=LBnPfAtswgw&feature=player_embedded

标签: iphone objective-c


【解决方案1】:

您问题顶部的层次结构显示了导航控制器,但随后您描述了将导航栏拖动到界面构建器中的视图。我认为你混淆了这两件事。您正在向现有视图添加导航栏,但导航栏只是 UIView 子类。将它添加到您的视图也不会创建导航控制器( UIViewController 子类),因此这就是为什么您的 self.navigationController 属性为零以及为什么当您将推送消息发送到该属性时没有任何反应的原因。

首先,如果您还没有阅读过 MVC(模型、视图、控制器)设计模式,那么您应该阅读一下,因为在这里您需要了解视图和控制器之间的区别。

UINavigationController 不会直接显示太多内容。他们所做的只是管理一堆其他 UIViewController。 UINavigationBar 是 UIViewController 直接显示的唯一视图。当您告诉导航控制器将视图控制器推送到堆栈上时,导航控制器会适当地更改导航栏并在屏幕上为新视图控制器的视图设置动画。 UINavigationBar 只是一个由导航控制器管理的哑 UIView。它本身不包含任何管理视图控制器堆栈的功能(这应该是 MVC 方法的一个明显假设,因此我在上面提出了建议)。

在某个地方,无论是在界面构建器中还是在您的代码中(我更喜欢后者),您都需要创建一个 UINavigationController。实际上,您需要为标签栏中的每个标签创建一个。将您的 UITabBarController 的 viewControllers 属性设置为这些导航控制器的数组。

然后,这些导航控制器中的每一个都需要被赋予一个视图控制器来显示为它们的第一个项目。为此,您可以将导航控制器的 rootViewController 属性设置为要显示在导航控制器堆栈顶部的视图控制器。

你遵守这个吗?我不觉得我解释得很好。我希望这有帮助。如果没有,请说出来,我会努力做得更好。

编辑

仅供参考,有时您可能希望在没有导航控制器的情况下使用 UINavigationBar。如果您正在实现自己的系统来跟踪视图控制器并在屏幕上和屏幕外为它们设置动画,那将是这样。 UITabBar 也是如此,这是另一个不应与具有相似名称的视图控制器混淆的视图。

【讨论】:

    【解决方案2】:

    调试并检查self是否指向visitedPlaced对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多