弹出以查看导航堆栈中的控制器

时间:2014-11-13 13:48:57

标签: ios objective-c uistoryboardsegue

我试图弹出导航堆栈中的视图控制器。

这就是我的故事板的样子。

enter image description here

我的表视图控制器有4个单元格。当我点击第四个单元格时,我想弹出到最后一个视图控制器。

#import "TableViewController.h"
#import "ViewController.h"

@interface TableViewController ()

@end

@implementation TableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 4;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    cell.textLabel.text = [NSString stringWithFormat:@"Cell %ld", (long)indexPath.row];

    return cell;
}

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

    switch (indexPath.row) {
        case 0:
            break;
        case 1:
            break;
        case 2:
            break;
        case 3:
            NSLog(@"%@", [NSString stringWithFormat:@"Cell %li tapped", (long)indexPath.row]);

            NSLog(@"%lu", (unsigned long)self.navigationController.viewControllers.count);

            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
            ViewController *VC4 = [storyboard instantiateViewControllerWithIdentifier:@"VCFour"];
            [self.navigationController popToViewController:VC4 animated:NO];

            break;
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

@end

错误

2014-11-13 13:40:58.942 Test[18601:1828547] Cell 0 tapped
2014-11-13 13:40:58.942 Test[18601:1828547] 1
2014-11-13 13:40:58.943 Test[18601:1828547] *** Assertion failure in -[UINavigationController popToViewController:transition:], /SourceCache/UIKit_Sim/UIKit-3318/UINavigationController.m:5568
2014-11-13 13:40:58.945 Test[18601:1828547] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Failed to get popped view controller.'

正如您所见,self.navigationController.viewControllers.count将1打印到控制台,这可能就是问题所在。这不应该是5,因为故事板上总共有5个视图控制器吗?

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

您的导航堆栈仅包含已经推送到它的控制器(这仅在实际运行segue时发生)。如果你在故事板中设置它们并不重要。如果您在控制器1上并且想要到达控制器4,则可以通过self.navigationCotnroller pushViewController:(或通过运行segue)按下控制器4,或者您可以在控制器上设置一个标志并按下控制器2检查标志并按下控制器3,它将检查标志并按下控制器4.这样更好,因为如果需要,你可以弹回控制器2/3,你的堆栈就像你设计的一样。

答案 1 :(得分:0)

当您使用instantiateViewControllerWithIdentifier创建新的viewcontroller时,您不会获得对现有viewcontroller的引用。 因此,你不能弹出它。

您似乎假设在单元格被点击时,整个视图控制器层次结构已经加载,但事实并非如此。只加载了所需的视图控制器,其他视图控制器仍未使用。

答案 2 :(得分:0)

首先,你所拥有的故事板设置是错误的,因为你想要实现的目标。 在没有修复故事板导航的情况下快速而肮脏的解决方案是将此行替换为[self.navigationController popToViewController:VC4 animated:NO];[self.navigationController pushViewController:VC4 animated:NO];

我建议您阅读Apple的Storyboard和UInavigationController文档,然后尝试理解为什么您的故事板设置不适合这项工作。

答案 3 :(得分:0)

希望可以帮助你。 的 LJMyCamViewController * lmyCamVC = self.navigationController.childViewControllers [2];             lmyCamVC.myCamera = user.SelectCamDevice;             lmyCamVC.myCameraSN = user.selectedSN;

        lmyCamVC.hidesBottomBarWhenPushed = YES;

        **NSLog(@"%@------%ld",self.navigationController.childViewControllers,self.navigationController.childViewControllers.count);
        [self.navigationController popToViewController:lmyCamVC animated:NO];**