2

これは私のストーリーボードです
絵コンテ 指摘したように、最初のビューに到達するためにログアウトボタンを追加しました。

アプリが起動すると、次のようになります:
始める
ログイン後、以下に示すようにタブバーに移動します:
ログアウト
「ログアウト」ボタンを最初のビューに接続し、プッシュを選択しました。しかし、「ログアウト」を押すと、これが起こります。
エラー
ログインビューをそのまま表示したいのですが、タブバーが表示され、表示したくない「戻る」ボタンも表示されます。
*最初の 3 つのタブ項目には独自のナビゲーション コントローラーがあり、ログアウト ボタンは最初のタブ項目にあります。

4

2 に答える 2

5

更新
TabBarController がloginController から提示されることがわかりました。

正しい戻り方は次のとおりです。

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];

以下のメモに残しておきますが、彼らは私たちが UINavigationController 階層を扱っていると想定していました。まだ読む価値があります!


ここに部分的な答えがあります...私がそれを書いた後、あなたのTab Bar ControllerはあなたのログインNavControllerスタックの一部ではないことに気付きました(とにかくそうは思いません)。 Segue/PUSHing が適していない理由を理解する。

後であなたのケースに対するより正確な回答で更新します...

セグエを使用したり、プッシュしたりしたくありません...カードのスタックのように考えてください。プッシュは、スタックにカードを追加することです。したがって、ログイン画面のバージョンを NavController スタックに追加します。 Tab Bar Controller 内に含まれています。これは、すでに作成したログイン画面のインスタンスと同じではなく、新しいインスタンスです (プッシュにより新しいインスタンスが作成されます)。

スタックからカードを取り除き、最初のカードに戻りたいとします。それが POP 操作です。

これらのいずれかが機能します。

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated

それらはUINavigationControllerメソッドです。UIViewController次のように、最上位からアクセスできます。

[self navigationController] popToRootViewControllerAnimated:NO;

[self navigationController] popToViewController:myLogInViewController animated:YES;

viewController に IBAction を配置することで、ログアウト ボタンからトリガーできます。

戻りたいviewControllerが実際にルートView Controllerであるように見えるので、それを試して動作するかどうかを確認してください。そうでない場合は、元に戻したい viewController への参照が必要になります。スタックを数えることでそれを行うことができます。スタックはviewControllers、ナビゲーション コントローラーの配列プロパティとしてアクセスされます。たとえば、rootViewController から 2 番目の viewController の場合、

UIViewController* logInViewController = 
        [[self navigationController] viewControllers] objectAtIndex:1];

あなたが求めているものを手に入れるでしょう。

于 2013-01-12T19:41:16.713 に答える
2

すべてのView Controllerに同じナビゲーションを使用している場合は、最初にナビゲーションスタックから最初のviewControllerオブジェクトを見つけて、そのビューにポップします。

例えば:

-(void)popToSelectedViewController
{
    NSArray *viewC=[self.navigationController viewControllers];

    FirstViewC *firstVC=nil;

    for (int i=0; i<[viewC count]; i++)
    {
        UIViewController *tempVC=[viewC objectAtIndex:i];
        if([tempVC isKindOfClass:[FirstViewC class]])
        {
            firstVC=[viewC objectAtIndex:i];
            break;
        }
    }

    if(firstVC)
        [self.navigationController popToViewController:firstVCanimated:YES];
    else
        [self.navigationController popToRootViewControllerAnimated:YES];

}

このメソッドは、ナビゲーション スタックで最初の VC を見つけ、そのビューにポップします。

これがお役に立てば幸いです。

編集後の別の回答:

あなたのイメージ

ストーリーボードでは、編集された画像を N1 および N2 クラスとして参照してください。クラスの名前がわからないので、N1とN2と書きました。

クラス N2 で通知を追加: N2 クラスのビュー DidLoad にこれを記述します。

-(void)viewDidLoad
{
  [super viewDidLoad];

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popToRooToview) name:@"PopView" object:nil];


   //other stuffs
}

通知セレクターを次のように定義します。

-(void)popToRooToview
{

  [self.navigationController popViewControllerAnimated:YES];

}

viewDidUnLoad の通知オブザーバーを削除する

-(void)viewDidUnload
{
     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"PopView" object:nil];
}  

Logout Btn をクリックすると、ur N1 クラスで次のメソッドが呼び出されます。

 -(void)logoutButtonClicked
{
   [[NSNotificationCenter defaultCenter] postNotificationName:@"PopView" object:nil];

}

// 通知名 "PopView" は、クラス N1 の通知と N2 のクラスの投稿通知で同じであることを思い出してください

于 2013-01-12T19:44:56.570 に答える