Проблема с popViewController и pushController

Я столкнулся с проблемой перенаправления viewControllers с помощью pop/pushViewControllers. У меня есть контроллер с тремя представлениями, как показано на изображении ниже.

Управление потоком

В моем третьем представлении у меня есть некоторые ToggleButton, основанные на этом toggleButton, данные, которые находятся во втором представлении, изменятся. После того, как я что-то изменил в 3-м представлении и нажал кнопку Done в моем 3-м представлении, я только что запустил свой 2-й ViewController, используя pushViewController И изменения произошли успешно.

Но в чем проблема, когда я пытаюсь нажать кнопку «Назад» на моей второй странице просмотра, она снова перенаправляет меня на 3-й viewController (из-за pushViewController)

Я пытаюсь запустить свой второй вид, используя popViewController, но это исключение.

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Tried to pop to a view controller that doesn't exist.

Я использовал код ниже -

SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
second.array = resultArray;
second.indexValue = ind;
[self.navigationController popToViewController:second animated:YES];

Как решить эту проблему? Есть идеи?


person Praveenkumar    schedule 29.10.2012    source источник


Ответы (3)


Из третьего контроллера просмотра вам просто нужно вызвать этот метод, чтобы перейти ко второму контроллеру просмотра:

[self.navigationController popViewControllerAnimated:YES];

РЕДАКТИРОВАТЬ :

Для уведомления второго vc об изменении данных вы можете использовать делегат. Следовать этому :

На ThirdViewController.h

@protocol DataChangeProtocol;
@interface ThirdViewController : UIViewController

@property(nonatomic,assign) id<DataChangeProtocol> delegate;

@end


@protocol DataChangeProtocol

- (void)thirdViewcontroller:(ThirdViewController*)vc dataChangedto:(NSDictionary *)changedData;

@end

И перед отправкой thridVC из secondVC назначьте secondVC в качестве делегата третьего VC:

ThirdViewController *thirdVC = [[ThirdViewController alloc]init..];
thirdVC.delegate = self;
[self.navigationController pushViewController:thirdVC animated:YES];

и в SecondViewController.m

- (void)thirdViewcontroller:(ThirdViewController*)vc dataChangedto:(NSDictionary *)changedData {
 // Change your values in the UI using the passed value from changedData.

}
person jithinroy    schedule 29.10.2012
comment
Все хорошо. Тогда как я буду представлять изменения, которые я сделал в моем 3-м представлении во 2-м контроллере представления? - person Praveenkumar; 29.10.2012
comment
используйте делегат, чтобы передать изменения второму контроллеру представления в контроллер thridviewcontroller. или, что еще лучше, сохраните изменения в центральной модели данных, где второй контроллер представления сможет получить к ним доступ, когда они появятся. - person jithinroy; 29.10.2012
comment
Как я могу это сделать? Есть ли пример для этой функции? - person Praveenkumar; 29.10.2012
comment
добавили несколько кодов для редактирования в ответ. надеюсь, это поможет - person jithinroy; 29.10.2012
comment
Попробую это и дам вам знать. - person Praveenkumar; 29.10.2012
comment
Работает нормально! Спасибо! - person Praveenkumar; 17.07.2013

Вы создаете наш контроллер представления:

SecondViewController *second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];

а затем вы хотите вытолкнуть его из своего стека, но этого контроллера нет в стеке, потому что вы создаете его в третьем viewController.

person edzio27    schedule 29.10.2012

Если вы хотите перейти к текущему предыдущему контроллеру представления, вам нужно сделать следующее:

[self.navigationController popViewControllerAnimated:YES];
person amit soni    schedule 29.10.2012
comment
Все хорошо. Тогда как я буду представлять изменения, которые я сделал в моем 3-м представлении во 2-м контроллере представления? - person Praveenkumar; 29.10.2012