[UINavigationController setView] 和 [UINavigationController setViewControllers] 的区别

Posted

技术标签:

【中文标题】[UINavigationController setView] 和 [UINavigationController setViewControllers] 的区别【英文标题】:Difference between [UINavigationController setView] and [UINavigationController setViewControllers] 【发布时间】:2014-07-17 08:55:35 【问题描述】:

我有一个方法,它应该初始化导航控制器并为侧边菜单加载视图控制器。这一切都发生在未附加到任何其他导航控制器的视图控制器中。

- (void)showLeftNC

    if (leftNavCon == nil)
    
        leftNavCon = [[UINavigationController alloc] init];
    

    [leftNavCon setViewControllers:@[lmvc] animated:NO];

    //[leftNavCon setView:lmvc.view];

    [leftNavCon.view setFrame:lmvc.view.frame];

    [self.view addSubview:leftNavCon.view];

    [self showCenterViewWithShadow:YES withOffset:-2];

    [self.view sendSubviewToBack:leftNavCon.view];

leftNavCon 是导航控制器

lmvc 是主视图控制器

这种方式不起作用,当我调用 initWithRootViewController:lmvc 时也不行

仅当我使用注释的 [leftNavCon setView:lmvc.view] 时它才有效。但即便如此,我仍然无法让导航控制器推送任何其他视图控制器。

请帮忙。

【问题讨论】:

[leftNavCon setView:lmvc.view] 表示将 UINavigationController 的视图设置为 lmvc 的视图。我猜你运行代码后推送的 viewController 视图将位于 UINavigationController 的视图下方。你确定[leftNavCon setViewControllers:@[lmvc] animated:NO]; 不起作用吗?我总是这样做。 它现在可以工作了,但是我使用视图控制器作为导航控制器的容器,因为它不能单独调用来 addSubView 【参考方案1】:

没关系,我解决了一些问题,我使用 lmvc 作为包含视图,初始化了导航控制器和我在其中需要的所有视图控制器

在 lmvc 的 initWithNibName 中

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization

        if (testViewController == nil)
        
            testViewController = [[UIViewController alloc] init];
        

        if (navCon == nil)
        
            navCon = [[UINavigationController alloc] initWithRootViewController: testViewController];
        

        view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 748)];

        [self setView:navCon.view];

        [testViewController.view addSubview:table];
        [testViewController.view addSubview:button];
        [testViewController.view addSubview:anyControlYouNeed];

然后是以后

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

if (tableTwo == nil)
    
        tabl = [[UITableView alloc] initWithFrame:table.frame];
    

    if (testViewControllerTwo == nil)
    
        testViewControllerTwo = [[UIViewController alloc] init];
    

    tableTwo.delegate = self;
    tableTwo.dataSource = self;
    [testViewControllerTwo setView:tableTwo];

    [navCon pushViewController: testViewControllerTwo animated:YES];

像魅力一样工作

【讨论】:

以上是关于[UINavigationController setView] 和 [UINavigationController setViewControllers] 的区别的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 和 UINavigationController 不适用于 iOS 4

翻转过渡 uinavigationcontroller push

UITabbarController 的“完成”按钮隐藏在 UINavigationController 后面

UINavigationController 不采用先例视图标题

UINavigationController 背景颜色更改在 iOS 中隐藏后退按钮

弹出视图时(使用 UINavigationController)使 NSTimer 无效并释放