帮助我理解如何使用此实现来访问UINaviagtionController

时间:2011-07-29 03:35:58

标签: iphone uinavigationcontroller

所以我正在构建一个应用程序,我正在运行一些不需要彼此了解的ViewControllers,所以我开始切换这样的视图......

    // remove the previous view in order to load in the new view
    NSArray *sViews = [self.view subviews];
    [sViews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    // create the new view, in this case the user wishes to 
    BaseViewController *baseVC = [[BaseViewController alloc] initWithNibName:@"BaseViewController" bundle:[NSBundle mainBundle]];
    self.baseViewController = baseVC;
    [baseVC release];

    // add the newly created view to the screen
    [self.view insertSubview:baseViewController.view atIndex:0];

以上是我希望导航控制器驻留的视图控制器。因此,在此视图控制器的.m中,我创建了一个UINavigationController作为成员变量并将其命名为navController。然后我尝试使用下面的代码实现UINavigationController。

    UIViewController *control = [[BusinessDisplayViewController alloc] initWithNibName:@"BusinessDisplayViewController" bundle: nil];
    navController = [[UINavigationController alloc] initWithRootViewController:control];
    [self presentModalViewController:navController animated:YES];

我遇到的问题有两个问题。首先,当加载BusinessDisplayViewController(下面)时,我的mapView和tableView之间有一个20像素左右的间隙,当我使用insertSubview:加载它时,它不存在。不知道为什么会这样。其次,一旦我在BusinessDisplayViewController.m中,我不知道如何访问在BaseViewController中创建的navigationController。有人可以解释为什么我的观点会受影响,我如何访问navigationController,或者我是否正确地采用了这种方式。

2 个答案:

答案 0 :(得分:1)

通常,您希望UINavigationController处于根级别,是否有特定原因让您的应用程序以这种方式设置?要回答您的问题,您可以通过为其设置property来访问变量,然后使用点符号:baseVC.navController

对于20像素空间问题,请发布与BaseViewController视图相关的代码。这可能是一个边界与框架问题。

答案 1 :(得分:1)

UINavigationController旨在用于iPhone上三种可能的上下文之一:

  1. 作为应用程序的根视图控制器,将其视图添加为应用程序窗口的子视图。
  2. 作为UITabBarController
  3. 的viewControllers之一
  4. 通过presentModalViewController:animated:提供为全屏视图控制器。
  5. 在您的情况下,UINavigationController已将自身配置为显示为窗口的子视图。这就是你在顶部看到20像素间隙的原因。由于窗口对象位于状态栏下方,UINavigationController会将其导航栏的位置偏移20像素(如果您正在通话,则会更多)。

    使用UINavigationController作为根视图控制器的标准方法是将其构建为application:didFinishLaunchingWithOptions:中应用委托的属性,并将其视图添加为窗口的子视图。然后在您推入导航堆栈的任何视图控制器中,您可以使用self.navigationController访问导航控制器对象。