3

「detailViewController」という UIViewController があります。

このビュー コントローラーは、プッシュ セグエを使用して複数の異なるセグエ経由でアクセスされます。

私が直面している問題は、detailViewController の戻るボタンがユーザーを以前のビュー コントローラーに戻すことです (そうあるべきです) が、戻るボタンでユーザーを masterViewController (アプリのデフォルトの UIViewController) に移動させたい.

どうすればいいですか?

セグエの種類を変更しようとしましたが、実際には何もしませんでした。

ピーター

4

5 に答える 5

3

あなたが探しているメソッドは UINavigationController のpopToRootViewControllerAnimated:

ドキュメントから:「ルートView Controllerを除くスタック上のすべてのView Controllerをポップし、表示を更新します。」

カスタムの戻るボタンを作成する必要があります。戻るボタンの機能をオーバーライドすることはできません。

次のようなものです:

UIButton *myBackButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myBackButton addTarget:self action:@selector(popToRoot:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *myCustomBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myBackButton];
[self.navigationItem setLeftBarButtonItem:myCustomBackButtonItem];

次に、 popToRoot: の実装は次のようになります。

- (void)popToRoot:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}
于 2014-02-27T17:41:41.087 に答える
0

戻るボタンを自分で作成して呼び出すことができます[self.navigationController popToRootViewControllerAnimated:YES]。ただし、戻るボタンを自分で作成する必要があります。別のオプションは、現在のView Controllerを取得し、最初と現在のものを除くすべてを削除することです。

NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy];
[viewControllers removeObjectsInRange:NSRangeMake(1, [viewControllers count] - 2)];
self.navigationController.viewControllers = viewControllers;
于 2014-02-27T17:43:16.043 に答える
0

あなたmasterViewControllerが話しているのがルートである場合は、次のように呼び出すことができます:

[self.navigationController popToRootViewControllerAnimated:YES];
于 2014-02-27T17:42:24.430 に答える
0

ナビゲーションコントローラーのコレクションを検索し、宛先コントローラーの名前を使用して既存のコントローラーと宛先コントローラーの間のオフセットを見つけ、中間コントローラーを削除する回避策を思いつきました。それがあなたのニーズに近いかどうかはわかりませんが、試してみてください:

- (NSArray *)navigateToViewController:(NSString *)destinationControllerName withControllers:(NSArray *)sourceControllers
{
    NSMutableArray *controllers = [[NSMutableArray alloc] initWithArray:sourceControllers];

    NSInteger sourceControllerIndex = [controllers count] - 1;  // Value should be index oriented instead of position oriented.
    NSInteger destControllerIndex = 0;

    // Find position of destination controller  (index oriented)
    for (UIViewController *controller in controllers)
    {
        NSString *controllerName = NSStringFromClass([controller class]);
        NSLog(@"class name: %@", controllerName);

        if([[controllerName lowercaseString] isEqualToString:[destinationControllerName lowercaseString]])
            break;

        destControllerIndex +=1;
    }

    // If desired controller does not exists in the stack, do not proceed.
    if (destControllerIndex == sourceControllerIndex)
    {
        return controllers;
    }
    // If destination is the same as source do not enter in this block
    // If destination and source controllers have zero or no controllers in between do not enter in this block
    // If destination and source controllers has few controllers (at least one) in between, go inside this block.
    // Here "destControllerIndex + 1" shows, there is at least one controller in between source and destination.
    else if(destControllerIndex + 1 < sourceControllerIndex)
    {
        NSLog(@"controllers in stack: %@", controllers);

        // Start from the controller following the source controller in stack and remove it
        // till the destination controller arrives
        for (NSInteger iterator = sourceControllerIndex - 1; iterator > destControllerIndex; iterator--)
        {
            UIViewController *cont = [controllers objectAtIndex:iterator];
            if(cont) {
            [cont release]; cont = nil; }
            [controllers removeObjectAtIndex:iterator];
            NSLog(@"controllers in stack: %@", controllers);
        }
    }

    return controllers;
}

いくつかのベースコントローラーでそれを定義します:

-(void) popToViewController:(NSString *)controllerName withNavController:(UINavigationController *)navController
{
    // STStatistics refers a singleton class of common functions.
    NSArray *mArr = [STStatistics navigateToViewController:controllerName withControllers:navController.viewControllers];  

    navController.viewControllers = mArr;

    // There should be more than one controller in stack to pop.
    if([mArr count] > 1)
    {
        [navController popViewControllerAnimated:YES];
    }
}

そして、これがどのように呼び出されるかです:

[self popToViewController:@"NameOfDestinationControllerInNavStack" withControllers:self.navigationController];
于 2014-02-27T18:07:57.777 に答える