3

ビューコントローラ間をジャンプする必要があります。例えば:

View1: First screen (Just logo)
View2: Download Screen
View3: First app screen (Some Buttons)
View4-View(N): some app screens

ユーザーがアプリに入ると、アプリはView1-> View2(ダウンロード)-> View 3-> View4-> View5に移動します。次に、ユーザーは最初のアプリ画面(View3)に移動します。

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO];

ユーザーが初めてアプリに入ると、View1-> View3(ダウンロード画面は不要になりました)になります。View3に移動するための別のプッシュセグエがあるので、ユーザーがView1-> View3->View4-に移動すると仮定します。 > View5、今度はView3に戻りたいので、関数は次のようになります。

NSArray *array = [self.navigationController viewControllers];
[self.navigationController popToViewController:[array objectAtIndex:2] animated:NO];

彼をView4に戻しますが、これは間違っています。どうすれば解決できますか?

4

8 に答える 8

2

ストーリーボードを使用している場合は、uiviewcontrollersのストーリーボードIDを設定し、それを使用してビューをポップおよびプッシュすることができます。

ここに画像の説明を入力してください

ストーリーボードの名前をMainStoryboard.storyboard

UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"MainStoryboard"
                                                  bundle:nil];
SettingsListViewController *settingsVC = [sb instantiateViewControllerWithIdentifier:@"SettingsListViewController"]; // @"SettingsListViewController" is the string you have set in above picture
[self.navigationController popToViewController:settingsVC animated:YES];

上記の解決策はあなたのために働くはずです、しかし私があなたであるならば、私は私のアプリの構造を変えるでしょう、あなたは言います:

View1: First screen (Just logo)
View2: Download Screen

View1は単なるロゴであり、View 2もスキップするビューであるため、ナビゲーションコントローラーからそれらを削除して、View3をナビゲーションコントローラーのビューにすることができますroot view controller。view1とview2が必要な場合はpresent them as Modal View Controllers

あなたがそれらを使い終わったら、言うことができます。ユーザーがアプリのロゴ画面を正常にロードし、present Download Screenダウンロードが成功した場合はそれを閉じます。

つまり、View3はルートビューコントローラとして存在します。たとえば、View(n)で、ホーム画面に移動したい場合は、View3を呼び出すだけです。

[self.navigationController popToRootViewControllerAnimated:NO];

オンになっていて、ポップして使用view(n)したい場合view(n-1)

[self.navigationController popViewControllerAnimated:YES];

幸運を、

于 2013-02-21T16:05:35.173 に答える
0

2番目のシーケンスでは、ナビゲーションスタックが変更され、view3はインデックス1になります。

[[self.navigationController popToViewController:[array objectAtIndex:1] animated:NO];

それを行う正しい方法になります。

于 2013-02-21T15:36:10.153 に答える
0

状況に応じて、viewControllerの名前を直接使用します

このように、viewControllerのインスタンスを作成します。ここでは、viewControllerの名前は-view3Controllerであると想定しています。

  View3Controller view3Controller=[[View3Controller alloc]init];
 [self.navigationController popToViewController:@"view3Controller" animated:NO]

またはストーリーボードを使用している場合は

View3Controller view3Controller=[self.storyboard instantiateViewControllerWithIdentifier:@"view3Controller"];

        [self.navigationController popToViewController:@"view3Controller" animated:NO]
于 2013-02-21T15:21:39.497 に答える
0

おそらく作成したセグエが原因で、実行時にView2がViewControllerアレイに追加されていないようです。

アプリケーションのロジックで必要とされるため、ビュー1>ビュー3から遷移するセグエを削除し、アニメーション化せずにユーザーをビュー2を超えてプッシュしてみてください。

// If the user needs to skip ahead to view 3, conditionally push view 2 and view 3 without animating
[self.navigationController pushViewController:viewController2 animated:NO];
[self.navigationController pushViewController:viewController3 animated:NO];

あるいは、セグエをそのままにしておくと、UINavigationController viewControllersプロパティのサイズを確認できず、ビュー2をスキップしたかどうかに関係なく、サイズに基づいて「推測」できますか?行った場合はpopToViewController、正しいインデックスにポップするようにメソッドを調整できます。他のビューもスキップする必要がある場合、これは確かにエレガントでなく、もろくありません。

// Check length of viewController array with 'N' views (pseudo code)
if (self.navigationController.viewControllers.length == N-1)
    // View 2 was ignored: pop to objectAtIndex:1
else 
    // View 2 was included: pop to objectAtIndex:2
于 2013-02-21T16:13:15.503 に答える
0

私があなたを正しく理解していれば、view3には特別なView Controllerがあるので、次のようなコードを使用できます。

NSArray *VCs = [self.navigationController viewControllers];
for (UIViewController *VC in VCs)
{
    if ([VC isKindOfClass:[**YOUR-VIEW-CONTROLLER** class]]) {
        [self.navigationController popToViewController:VC animated:NO];
    }
}

シンプルで機能します!

于 2013-07-25T18:26:21.317 に答える
0

私はいつもこれを使用します、そしてそれはあなたの場合にはうまくいくでしょう。実際、次のコード行は、すばやくコピー/貼り付けできるように「メモ」にコピーされます。

そうでない場合は、必ずViewController.hファイルをインポートしてください。

for (UIViewController *viewController in self.navigationController.viewControllers) {
        if([viewController isKindOfClass:["your ViewController" class]]) {
            [self.navigationController popToViewController:viewController animated:NO];
        }
    }
于 2015-10-20T10:51:22.270 に答える
0
for (UIViewController* controller in self.navigationController.viewControllers) {
        if ([controller isKindOfClass:[<Your View Controller Name> class]]) {
            [self.navigationController popToViewController:controller animated:YES];
            return;
        }
    }
于 2016-08-23T08:56:08.357 に答える
-1

このように特定のビューコントローラに移動します

  [self.navigationController popToViewController:[[self.navigationController viewControllers]objectAtIndex:1] animated:YES];
于 2015-02-05T09:59:28.630 に答える