Вызвать 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];
    }
}
Другие вопросы по тегам