1

ビューをナビゲートする際に少し問題があります。これが私の構成です:ナビゲーションコントローラー内に埋め込まれた2つの単純なビューへの2つの関係セグエを持つ1つのタブバーコントローラーがあります。次に、ViewController1からViewController3に移動し、タブバー内で選択された正しいタブを表示したいと思います。また、View Controller 1から来た場合は、戻るボタンで前のタブにリダイレクトすることも必要です。そのビューの間にセグエを接続して何かを試しましたが、そうすると、View Controllerがナビゲーションスタックにプッシュされるだけで、タブは変更されません。だから私の質問は、この問題を管理するための最良の方法は何ですか?

スクリーンショット:

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

4

1 に答える 1

1

これを行う方法は次のとおりです。しかし、私はあなたがそれをすべきでない理由を説明するためにこれを本当に投稿しています。

  • VC2とVC3のviewtagプロパティを使用して、ナビゲーションデータを渡します。これは、3つのオブジェクトすべてを緊密に結合する効果があります。
  • VC1->VC3コンテキストの戻るバーボタンをオーバーライドします。一貫性が失われます。
  • VC3->VC2はバックアニメーションを提供します。VC3-> VC1は、あるタブから別のタブに反転するため、アニメーションはありません。より多くの矛盾
  • VC1-> VC3で、[タブ項目2]をタップしてVC2に移行します。UIの混乱。

とにかく、あなたがまだこれをしたいのなら...。

ViewController1
「VC3にジャンプ」ボタンがあり、jumpToVC3に接続します。

 //ViewController1.m

#import "ViewController1.h"

@implementation ViewController1

- (IBAction)jumpToVC3:(id)sender {
    NSArray* viewArray = [[[self.tabBarController viewControllers] objectAtIndex:1] viewControllers];
    [[[viewArray lastObject] view] setTag:1];
    [self.tabBarController setSelectedIndex:1];
}
@end

「jumptToVC3」はタブ2に切り替え、最前面のビューのビュータグプロパティを1に設定します。最前面のビューがVC2の場合、これによりVC3への即時セグエがトリガーされます。最前面のビューがVC3の場合、これにより戻るボタンが正しく設定されます。他のViewControllerがこのスタックに追加されると、このナビゲーションは機能しなくなります。

ViewController2
には、VC3「toVC3」へのストーリーボードセグエに配線された「movetoVC3」ボタンがあります

    //  ViewController2.m

#import "ViewController2.h"
#import "ViewController3.h"

@implementation ViewController2

    //we use the view.tag property as a switch:
    //0 = do nothing
    //1 = segue to VC3
    //2 = go to tab 0  

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (self.view.tag ==1){
        [self performSegueWithIdentifier:@"toVC3" sender:self];
    } else if (self.view.tag == 2){
        [self.tabBarController setSelectedIndex:0];
    }
    self.view.tag = 0;
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if (self.view.tag ==1) {
        [[segue.destinationViewController view] setTag:1];
    } else {
        [[segue.destinationViewController view] setTag:0];
    }
    self.view.tag = 0;
}

- (void) viewWillDisappear:(BOOL)animated
{
    self.view.tag = 0;
}

@end

ViewController3
view.tagが1に設定されている場合、戻るボタンをオーバーライドします。両方のコンテキストの戻るボタンを一貫させたい場合は、デフォルトの動作もオーバーライドする必要があります。このオーバーライド動作の標準の戻るボタンの外観を取得することはできません。

    //  ViewController3.m

#import "ViewController3.h"

@implementation ViewController3

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (self.view.tag == 1) {
        self.navigationItem.leftBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:@"0.0"
                                         style:UIBarButtonItemStyleBordered
                                        target:self
                                        action:@selector(goBack:)];
    }
    self.view.tag = 0;
}

- (IBAction)goBack:(id)sender {
    [[[[self.navigationController viewControllers]
       objectAtIndex:0] view] setTag:2];
        [self.navigationController popToRootViewControllerAnimated:YES];
}
@end
于 2013-01-18T13:44:17.010 に答える