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

无法为子视图推送ViewController

  •  4
  • runmad  · 技术社区  · 16 年前

    我有一个uinavigationcontroller,我有单独的ui视图,可以在使用uisegmentcontrol之间切换。切换视图时,我将视图作为子视图添加到导航控制器的视图中:

    [self.view addSubview:segmentTab1.view];
    

    和

    [self.view addSubview:segmentTab2.view];
    

    然后,在子视图中,每个视图都有一个UITableView,但我的问题是,无法在 didSelectRowAtIndexPath 方法。

    方法被正确地调用,通过设置断点,我可以看到推送视图的方法也被调用了,但是什么也没有发生。这是我推它的代码:

    [self.navigationController pushViewController:detailsViewController animated:YES];

    我也尝试过

    [super.navigationController pushViewController:detailsViewController animated:YES];

    我到底做错了什么——或者根本不可能用子视图来做?

    6 回复  |  直到 13 年前
        1
  •  6
  •   Matt Long    16 年前

    当您调用-pushviewcontroller时,哪个视图控制器是自己的?如果您从某个选项卡子视图中调用它,则self可能没有从添加到的顶级视图中引用导航控制器。您可以通过从顶层视图中获取导航控制器的内存地址并将其与子视图中的内容进行比较来验证这一点。显然,如果是零或者不匹配,那就是你的问题。

    只有将导航控制器“免费”添加到导航堆栈本身时,才会使用-pushviewcontroller,而您的子视图并未以这种方式添加。

        2
  •  2
  •   Community Mohan Dere    9 年前

    在为所有视图实现一个公共头文件时,我也遇到了类似的问题。 经过多次尝试,我已经通过这个修复了它-

    在所有视图控制器中

    - (void)viewWillAppear:(BOOL)animated {
    
        [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];
        [[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES];
    
    }
    

    我参考了下面的文章来实现标题视图 Common XIB in multiple View Controller in iPhone

    [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];     // line will load the header subview 
    

    [[(navappappdelegate*)[[uiapplication sharedaplication]delegate]headerview]viewwill显示:是;//这是调用headercontroller的viewwillappear方法,在这里我们可以编写代码来检查用户是否已登录,并将登录按钮更改为注销按钮等。

        3
  •  1
  •   luvieere    16 年前

    而不是

    [self.view addSubview:segmentTab1.view];
    

    和

    [self.view addSubview:segmentTab2.view];
    

    您可以使用

    [self pushViewController: segmentTab1 animated: NO];
    

    和

    [self pushViewController: segmentTab2 animated: NO];
    

    将视图控制器添加到导航层次,并使 [super.navigationController pushViewController:detailsViewController animated:YES]; 工作。

        4
  •  0
  •   Louis Gerbarg    16 年前

    我并不完全清楚您的视图层次结构是什么,但一般来说,如果您的导航控制器视图不是窗口的第一个子视图或Apple某个集合视图的元素(另一个导航视图控制器的内容视图或选项卡控制器的内容视图),它将无法正常工作。

        5
  •  0
  •   Amagrammer    16 年前

    如果您不反对singleton,一种可能是使产品的uinavigationController对象成为singleton,可以从(例如)应用程序委托访问。

    您可以这样调用它:

    [[((MyApplicationDelegate*)[UIApplication delegate]) navController] 
                    pushViewController: viewControllerToPush animated: YES];
    

    在myApplicationDelegate中,navController返回singleton对象。

        6
  •  0
  •   dreadbot    15 年前
    LogEntryDetailViewController *leController = [[LogEntryDetailViewController alloc] initWithNibName:@"LogEntryDetailView" bundle:[NSBundle mainBundle]];
        [leController setTitle:[NSString stringWithFormat:@"%@", [logEntriesArray objectAtIndex:row]]];
        [[self navigationController] pushViewController:leController animated:NO];      
        [leController release], leController = nil;