2014-11-13 3 views
0

Я пытаюсь вывести контроллер представления в свой стек навигации.Поп, чтобы просмотреть контроллер в стеке навигации

Это то, на что похожа моя раскадровка.

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 диспетчеров просмотра?

Может ли кто-нибудь помочь?

+0

Вы не можете использовать контроллер точки зрения, который не находится в вашем стеке навигации. Вы хотите нажать PUSH новый контроллер. – Stonz2

+0

Как добавить этот контроллер в свой стек навигации? – user3626407

ответ

0

Когда вы используете instantiateViewControllerWithIdentifier, вы создаете новый диспетчер представлений, вы не получаете ссылку на существующий. Следовательно, вы не можете прикоснуться к нему.

Вы, кажется, предположили, что во время прослушивания ячейки вся иерархия viewcontroller уже загружена, это не так. Загружаются только требуемые контроллеры просмотра, остальные остаются неиспользованными.

1

Ваш навигационный стек содержит только контроллеры, которые уже нажаты на него (это происходит только тогда, когда выполняется segue). Неважно, если вы настроили их на доске объявлений. Если вы находитесь на контроллере 1 и хотите попасть на контроллер 4, вы можете либо нажать контроллер 4 следующим образом: self.navigationCotnroller pushViewController: (или запустив segue), либо вы можете установить флаг на своем контроллере и нажать контроллер 2, который затем проверит флаг и нажмите контроллер 3, который будет проверять флаг и нажимать контроллер 4. Этот способ лучше, так как вы можете снова вернуться к контроллерам 2/3, если вам нужно, и ваш стек будет разработан по вашему усмотрению.

+0

Я использовал флаг, чтобы нажать на контроллер вида, и он работает. Однако вы можете увидеть, как они все нажимают. Например, если вы переходите от 1 до 4, вы видите нажатие на 1,2 и 3. Есть ли способ избежать этого? – user3626407

+0

Если вы переходите от 1> 4, установите опцию '' 'animated''' в' '' pushViewController: '' '' '' NO''' на 2 +3. Я думаю, что это должно сработать (если вы играете с настройкой опции '' 'animated:' '' '' 'NO''', вы должны ее получить). –

0

Прежде всего, у вас есть неправильная установка раскадровки, для чего вы пытаетесь достичь. быстрый и грязный раствор без фиксации раскадровки навигации вы сделали это, чтобы заменить эту строку: [self.navigationController popToViewController:VC4 animated:NO]; с этой линией: [self.navigationController pushViewController:VC4 animated:NO];

я предлагаю вам прочитать Раскадровка и UINavigationController документы Apple, а затем попытаться понять, почему установка раскадровки вы есть неправильная вещь для работы.

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];** 
Смежные вопросы