4

RTL 言語をサポートするために、右から左へのナビゲーション コントローラーを構築しています。StackOverFlow Push ViewController from Right To Left with UINavigationControllerのいくつかの投稿を読んだ後、この方法が最適であると判断しました。

DetailedViewController *DVC = [[DetailedViewController alloc]initWithNibName:@"DetailedViewController" bundle:nil];
NSMutableArray *vcs =  [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[vcs insertObject:DVC atIndex:[vcs count]-1];
[self.navigationController setViewControllers:vcs animated:NO];
[self.navigationController popViewControllerAnimated:YES];

これにより、詳細なView Controllerが作成され、NavigationControllerのすぐ下にあるView Controllerのスタックに追加されます。NavigationController をポップすると、実際に DetailedViewController をロードしているように見えます。

今、私は2つの問題に直面しています:

1- Detailed View Controller に戻るボタンが表示されなくなりました。そこで、代わりにこれを行う新しいボタンを追加することにしました。

2- DetailedViewController から NavigationController に戻る方法がわかりませんでした。

何か案は?

4

2 に答える 2

5

基本的にナビゲーションコントローラーをハッキングしていることを考えると、動作の一貫性を保つために、さらにハックする必要があります。

ナビゲーションコントローラーをポップするとメモリから解放されるため、おそらくポップされたコントローラーを含む別の配列またはスタックが必要になるでしょう(ユーザーの観点からはプッシュされたコントローラーです。私が見る限り、プッシュする必要があるときはいつでもポップし、プッシュしますポップする必要があるときはいつでも)。その配列/スタックでは、戻る必要があるコントローラーを保持し、それらをポップする直前に配列/スタックにプッシュします。

otherNavigationController簡単にするために、いつでもアクセスできる場所に可変配列が存在すると仮定し、それを呼び出します。

DetailedViewController *DVC = [[DetailedViewController alloc]initWithNibName:@"DetailedViewController" bundle:nil];
NSMutableArray *vcs = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[vcs insertObject:DVC atIndex:[vcs count]-1];
[self.navigationController setViewControllers:vcs animated:NO];
[otherNavigationController addObject:self];
[self.navigationController popViewControllerAnimated:YES];

質問の2番目の部分については、デフォルトの戻るボタンが機能しないため、カスタムの戻るボタンを追加する必要があります。カスタムボタンは、前述の配列/スタックの一番上からView Controllerを押す必要があります(ユーザーの観点からポップします)。

pop 関数のコードは次のようになります。

UIViewController *previousViewController = [otherNavigationController lastObject];
[otherNavigationController removeLastObject];
[self.navigationController pushViewController:previousViewController animated:YES];

免責事項: ここにあるコードは試行もテストもされていないため、これが機能するかどうかさえわかりませんが、問題は解決するはずです。幸運を!

于 2012-08-19T01:44:27.297 に答える
1

@locke のソリューションに触発されて、次のようにコードを書き直しました。

1- appdelegate で preViewController と呼ばれる UIViewController を定義して、マスター ビュー コントローラーを保持します。

2-View Controllerで参照するには、次を使用します。

AppDelegate *appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];

3- 次の masterviewcontroller を次のように記述します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //create a mutable arry to hold the view controllers and copy the current list of navigation controllers
    //at this point there is only the current view controller in stack

    NSMutableArray *vcs =  [NSMutableArray arrayWithArray:self.navigationController.viewControllers];

    //create a detailed navigation controller
    DetailedViewController *DVC = [[DetailedViewController alloc]initWithNibName:@"DetailedViewController" bundle:nil];

    //create a shared variable enviroment to reference a global variable 
    AppDelegate *appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];

    //assign the current viewcontroller to the temporary view controller
    appdelegate.preViewController=[self.navigationController.viewControllers lastObject];

    //insert detailed view into the array vcs before the current viewcontroller
        if (![vcs containsObject:DVC]) {
        [vcs insertObject:DVC atIndex:[vcs count]-1];
     }
    // update the self.navigation with the new stack
    [self.navigationController setViewControllers:vcs animated:NO];

    // pop the  othernavigationcontroller from the navigation stack to fake a detailedview controller push 
     [self.navigationController popViewControllerAnimated:YES];
}

4 - デフォルトのボタンを置き換えるボタンを追加し、詳細ビュー コントローラの IBaction (backClicked) を定義します。

- (IBAction)backClicked:(id)sender{
AppDelegate *appdelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
//push the holder view controller to fake a pop back to the master view controller
[self.navigationController pushViewController:appdelegate.preViewController animated:YES];
}
于 2012-08-19T17:13:45.303 に答える