代码之家  ›  专栏  ›  技术社区  ›  buley

标签栏和导航控制器:我的接口生成器布线哪里出错了?

  •  0
  • buley  · 技术社区  · 16 年前

    我在xcode中开发了一个iphone应用程序,并使用了tab bar项目类型的interface builder。在获得主题(业务部门)的表视图后,我意识到我需要添加一个导航控件,以允许用户钻入子主题(子部门)表。

    作为一个绿色的objective-c开发人员,这让我很困惑,但我通过阅读各种文档,尝试了一些不同的ib选项,使它工作起来。我当前的设置是一个选项卡栏控制器,其中选项卡1是导航控制器,选项卡2是一个普通视图,其中放置了一个表视图。连接工作:当选择了表行并且准备将新的视图控制器推送到堆栈上时,我可以记录,这样我就可以显示subtopics表视图。

    我的问题:由于某种原因,第一个选项卡的表视图是第二个选项卡的委托和数据源。这对我来说毫无意义,我不明白为什么这是唯一有效的设置。我有其他的问题,我认为是由愚蠢的线路引起的。

    alt text http://i43.tinypic.com/30nap85.jpg

    这是接线图:

    • 导航控制器(扇区)是 标签栏代表
      • 导航栏是 导航控制器代表 (扇区)
      • 视图控制器(扇区)具有表视图视图
      • 表视图(在导航中 控制器(扇区)是一个委托 第一视图控制器的 (公司)
      • 表视图(在导航中 控制器(扇区)是第一视图控制器的数据源出口 (公司)
    • 第一视图控制器(公司)
      • 第一个视图控制器(扇区)具有表视图的视图
      • 表视图(在第一视图控制器(公司)中)没有连接到数据源出口,也不是委托

    当我单击选项卡按钮并查看检查器时,我发现第一个选项卡正确地连接到了mainwindow.xib,第二个选项卡选择了一个名为secondview.xib的nib。它位于mainwindow.xib文件的所有者中,在该文件中,我继承了.h中的uitableviewdatasource和uitableviewdelegate(以及uitabbarcontrollerdelegate),在.m中,我实现了delegate方法。

    为什么只有当第一个选项卡(视图控制器(扇区))中的表视图是第二个选项卡的委托和数据源时,此设置才起作用?我很困惑:为什么不需要将它连接到显示表视图的导航控制器启用选项卡(导航控制器(扇区))?在第二个选项卡上看到的表视图既没有数据源也不是委托。

    alt text http://i40.tinypic.com/15ri1ig.jpg alt text http://i44.tinypic.com/2dwete9.jpg

    我无法启动push view controller(self.navigationcontroller不是nil,但是新的视图控制器仍然没有加载),我怀疑我需要解决这个ib布线问题,然后才能解决nav控制器为什么不会将新的视图控制器推到堆栈上的问题。

    if(nil == self.navigationController) {
        NSLog(@"self.navigationController is nil.");
    } else {
        NSLog(@"self.navigationController is not nil.");
        SectorList *subsectorViewController = [[SectorList alloc] initWithNibName:@"SectorList" bundle:nil];
        subsectorViewController.title = @"Subsectors";
        [[self navigationController] pushViewController:subsectorViewController animated:YES];
        [subsectorViewController release];
    }
    
    1 回复  |  直到 16 年前
        1
  •  0
  •   cduhn    16 年前

    我首先想到的是,扇区选项卡的视图控制器是uiviewcontroller,而不是uitableviewcontroller。您应该删除整个视图控制器,并从ib中的库中拖动uitableviewcontroller,然后将其放到uinavigationcontroller上。它将附带一个已经连接为其视图的uitableview,uitableviewcontroller已经设置为该tableview的数据源和委托。

    一旦nib中有uitableviewcontroller,就应该在inspector中将它的类名更改为在代码中实现的uitableviewcontroller子类的名称。

    还有一件事:当您声明表视图“是一个数据源”和“是一个委托”时,数据源和委托关系是向后的。只是为了澄清:

    • tableview有一个datasource属性,该属性指向实现uitableviewdatasource协议的对象(通常是uitableviewcontroller子类实例)。
    • tableview有一个delegate属性,该属性指向实现uitableviewdelegate协议的对象(通常是同一个uitableviewcontroller子类实例)。
    • uitableviewcontroller类实现uitableviewdatasource和uitableviewdelegate协议。如果配置正确,则自定义uitableviewcontroller子类是其tableview的数据源和委托。