Iphone 帮助我了解如何使用此实现访问UINavigationController

Iphone 帮助我了解如何使用此实现访问UINavigationController,iphone,uinavigationcontroller,Iphone,Uinavigationcontroller,所以我正在构建一个应用程序,我正在运行一些不需要相互了解的ViewController,所以我开始切换视图,就像这样 // remove the previous view in order to load in the new view NSArray *sViews = [self.view subviews]; [sViews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // cr

所以我正在构建一个应用程序,我正在运行一些不需要相互了解的ViewController,所以我开始切换视图,就像这样

    // 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,或者我是否以正确的方式进行了操作。

通常,您希望您的UINavigationController位于根级别,您的应用程序以这种方式设置是否有特定的原因?不过,要回答您的问题,您可以通过为变量设置a来访问该变量,然后使用点表示法:
baseVC.navController


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

UINavigationController
设计用于iPhone上三种可能的环境之一:

  • 作为应用程序的根视图控制器,其视图作为应用程序窗口的子视图添加
  • 作为
    UITabBarController
    的视图控制器之一
  • 通过
    presentModalViewController:animated:
    显示为全屏视图控制器
  • 在您的例子中,
    UINavigationController
    已将自身配置为显示为窗口的子视图。这就是为什么您会在顶部看到20像素的间隙。由于窗口对象位于状态栏下方,
    UINavigationController
    会将其导航栏的位置偏移20像素(如果您正在通话,则偏移量会更大)


    使用
    UINavigationController
    作为根视图控制器的标准方法是在
    application:didfishlaunchingwithoptions:
    中将其构造为应用程序委派的属性,并将其视图添加为窗口的子视图。然后,在推到导航堆栈上的任何视图控制器中,可以使用
    self.navigationController

    访问导航控制器对象,这不是在根级别设置导航控制器的主要原因。主要是我有一个钥匙链检查和注册/登录屏幕,我觉得不需要使用导航控制器(不相互传递任何信息,不需要“返回”任何一个,等等)。但当我加载列出业务的mapView和tableView时,用户单击DetailDisclosure按钮,会出现一个更详细的业务页面,通过navController,我可以“返回”到地图和业务列表。我在BaseViewController中创建了导航控制器,{IBOutlet UINavigationController*navController;}(at)属性(非原子,retain)UINavigationController*navController;我也在.m中合成了它,我可以在BaseViewController.m中轻松访问它,但当我在BusinessDisplayViewController.m中时,我会像这样创建一个新变量吗?BaseViewController*baseVC=[BaseViewController alloc];baseVC.navController.navigationBar.barStyle=UIBarStyleBlackTranslucent;因为这在我身上崩溃了。从一开始就使用导航控制器。你可以将其设置为不显示nab栏和任何工具栏,然后在按下时不做动画,基本上也有相同的效果。我认为这将解决你20像素的问题tooSo bas事实上,我需要放弃我的思维方式,只在应用程序的根添加navigationController,而不是试图用它来变得可爱:)而且这个差距不是在我的视图的顶部,实际上是在mapView和tableView之间。嗯,我想这取决于你所说的“变得可爱”是什么意思.请记住,苹果设计的
    UIViewController
    框架用于管理“全屏”视图。如果您试图创建一个只占用部分屏幕的导航控制器,您可能无法在iOS 4中使用它。但是,如果您的导航控制器是全屏的,并且您不希望它是根,您可以始终使用
    presentModalViewController:animated:
    来显示它。