web-dev-qa-db-ja.com

あるView Controllerから別のView Controllerにポップする方法

IOSの使用15個のViewControllerがあり、あるViewControllerから別のViewControllerにポップしたい。

私はこのコードを使用しています:

_SecondViewController *Sec=[SecondViewController alloc]init];
[self.navigationController popViewController:Sec animated:YES];
_

これはエラー_this ViewController not exist_を示し、このコードを使用しています:

_NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:1] animated:YES];
_

このコードは、thirdViewControllerからsecondViewControllerにポップする権利があります。しかし、Ninth(9th)ViewControllerからFifth(5th)ViewControllerにポップすると、Ninth(9th)ViewControllerで次のコードを使用します。

_NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:4] animated:YES];
_

Ninth(9th)ViewControllerをEight(8th)ViewControllerにポップする以外は、Ninth(9th)ViewControllerからFifth(5th)ViewControllerにポップしません。この行を使用したときに何が起こったのかわかりません:

_NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);
_

Ninth(9th)ViewControllerでこれを使用する場合。 NsLogの表示:

_array=   First(1st)ViewController;  
         Second(2nd)ViewController;
         Eight(8th)ViewController;
         Ninth(9th)ViewController;
_

Four View Controllerだけが表示される理由はわかりません。 15個のView Controllerを使用しているときはいつでも。この問題は、各View Controllerで発生します。たとえば、fifteenth(15th)ViewControllerからFifth(5th)ViewControllerにポップフォームを使用している場合、同じ問題が発生します。

_NSArray *array = [self.navigationController viewControllers];
NsLog(@"array = %@",array);

array=     First(1st)ViewController;  
           Second(2nd)ViewController;
           fourteenth(14th)ViewController;
           fifteenth(15th)ViewController;
_

ViewControllerの数をカウントしてから、特定のViewControllerにポップします。

21
Rahul Sharma

Swift 4.0-Swift 5.

 for controller in self.navigationController!.viewControllers as Array {
            if controller.isKind(of: HomeViewController.self) {
                self.navigationController!.popToViewController(controller, animated: true)
                break
            }
        }
2
Pranit

新しいView Controllerにポップすることはできません(secondViewControllerの例のように)。

UINavigationControllerを使用する場合、

コントローラーの追加スタックに:

[self.navigationController pushViewController:<yournewViewController> animated:YES];

前のものへのポップ with:

[self.navigationController popViewControllerAnimated:YES];

前のコントローラーへのポップスタック内(前にプッシュされている必要があります):

[self.navigationController popToViewController:<ViewControllerToPopTo> animated:YES];

ルートに戻るコントローラー

[self.navigationController popToRootViewControllerAnimated:YES];
36
Eric Genet
for (UIViewController *controller in self.navigationController.viewControllers)
        {
            if ([controller isKindOfClass:[nameOfYourViewControllerYouWantToNavigate class]])
            {
                [self.navigationController popToViewController:controller animated:YES];

                break;
            }
        }
31
KDeogharkar

これを試して

 [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
7
vardhanReddy

最初:

 SecondViewController *Sec=[SecondViewController alloc]init];
 [self.navigationController popViewController:Sec animated:YES];

Navigation Controllerにない新しいSec View Controllerを割り当てるため、これを行うことはできません。

これの使用を検討してください:

あなたは9 View Controllerにいます

for (int i= 0 ; i < [[self.navigationController viewControllers]count] ; i++) {
    if ( [[[self.navigationController viewControllers] objectAtIndex:i] isKindOfClass:[FifiViewControllerClassname class]]) {
        [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES];
    }
}
5
Elto

こうやって

MyTableViewController *vc = [[MyTableViewController alloc] init];
NSMutableArray *controllers = [NSMutableArray    
arrayWithArray:self.navigationController.viewControllers];
[controllers removeLastObject];
[controllers addObject:vc]; 
1
iTag
BOOL check = FALSE;
NSArray *viewControllers = [[self navigationController] viewControllers];
id obj;
for( int i=0;i<[viewControllers count];i++)
{
    obj=[viewControllers objectAtIndex:i];
    if([obj isKindOfClass:[yourclassname class]])
    {
        check = TRUE;
        break;
    }
}

if (check)
{

    [[self navigationController] popToViewController:obj animated:YES];
}
else
{
    yourclassname *yourclassnameObj=[self.storyboard instantiateViewControllerWithIdentifier:@"yourclassStoryBoardID"];
    [self.navigationController pushViewController:yourclassnameObj animated:true];

}
1
Tejinder

Swift 3.の場合、フィルターを使用:

let desiredViewController = self.navigationController!.viewControllers.filter { $0 is YourViewController }.first!
self.navigationController!.popToViewController(desiredViewController, animated: true)
1