Вызвать popToRootViewController из другой вкладки
У меня есть панель вкладок с приложением контроллера навигации, используя раскадровку,
моя цель состоит в том, чтобы нажать кнопку в tab3 и в фоновом режиме я хочу, чтобы tab1 "popToRootViewController"
кнопка в tab3 viewcontroller:
- (IBAction)Action:(id)sender {
vc1 * first = [[vc1 alloc]init];
[first performSelector:@selector(popToRootViewController) withObject:Nil];
}
код в view1-контроллере tab1
-(void)popToRootViewController{
[self.navigationController popToRootViewControllerAnimated:NO];
NSLog(@"popToRootViewController");
}
Я получаю popToRootViewController
в логах, но действие не выполнено.
что решит проблему:
- (IBAction)Action:(id)sender {
[[self.tabBarController.viewControllers objectAtIndex:0]popToRootViewControllerAnimated:NO];
}
4 ответа
То, как вы это делаете:
vc1 * first = [[vc1 alloc]init];
[first performSelector:@selector(popToRootViewController) withObject:Nil];
не является правильным. На самом деле, вы создаете здесь совершенно новый контроллер, совершенно независимый от существующих контроллеров и не принадлежащий ни одному навигационному контроллеру. По этой причине, self.navigationController
является nil
в popToRootViewController
,
Вы можете попробовать сделать что-то вроде:
//-- this will give you the left-most controller in your tab bar controller
vc1 * first = [self.tabBarController.viewControllers objectAtIndex:0];
[first performSelector:@selector(popToRootViewController) withObject:Nil];
Связать TabBar с tabBarViewController-
В tabBarViewController.m
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
NSArray *array = [tabBarController viewControllers];
if([[array objectAtIndex:tabBarController.selectedIndex] isKindOfClass:[UINavigationController class]])
[(UINavigationController *)[array objectAtIndex:tabBarController.selectedIndex] popToRootViewControllerAnimated: NO];
}
Это отлично сработало для меня.
To press a button in tab3 and in the background I want tab1 to "popToRootViewController"
Если вы хотите выполнить popToRootViewController
в tab1, нажав кнопку в tab3, то я хотел бы предложить использовать NSNotificationCenter
, Например, следуйте приведенному ниже коду:-
В вашем firstViewController
класс добавить наблюдателя NSNotification
- (void)viewDidLoad
{
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(yourMethod:)
name:@"popToRootViewControllerNotification" object:nil];
}
-(void)yourMethod:(NSNotification*)not
{
[self.navigationController popToRootViewControllerAnimated:NO];
}
В вашем ThirdViewController
класс пост notification
в коде ниже:-
- (IBAction)Action:(id)sender {
// vc1 * first = [[vc1 alloc]init];
// [first performSelector:@selector(popToRootViewController) withObject:Nil];
//Post your notification here
[[NSNotificationCenter defaultCenter] postNotificationName:@"popToRootViewControllerNotification" object:nil];
}
Если ваши tab1 и tab2 находятся в разных навигационных контроллерах, попробуйте это в - (IBAction)action:(id)sender
NSArray *viewControllers = [self.tabbarController viewControllers];
for (UIViewController *viewController in viewControllers) {
if ([viewController isKindOfClass:[vc1 class]]) {
vc1 * first = (vc1 *) viewController;
[first.navigationController popToRootViewControllerAnimated:NO];
}
}