0

ナビゲーション コントローラー スタックからビューを削除する方法に関するいくつかの投稿を検索して見つけました。ここにある手法の 1 つを実装しました: How can I remove a view from Navigation Controller . ただし、ビューがスタックから削除されている間、対応する UINavigationItem がナビゲーション バーから削除されないため、ナビゲーション バーが現在のビューと同期しなくなります。

具体的には、ストーリーボードのナビゲーション コントローラーの制御下に一連のビューがあります。開始ビューでは、ユーザーは 2 つの分岐のいずれかを選択して従うことができます。最初のブランチでは、ユーザーは、iPhone または iPad が Wi-Fi 経由で接続されている組み込みシステムからのセンサー データを受信して​​表示できます。もう 1 つのパスでは、ユーザーは管理者としてログインし、一部の構成コマンドを外部組み込みシステムに送信できます。

ユーザーが管理ルートに進むことを選択した場合、メイン -> 管理者ログイン -> 管理という一連の画面に従います。管理ビューでは、ユーザーはいくつかのタスクを実行できます。私がやりたいことは、管理者がメインに戻るときに管理者ログイン画面をスキップしてから、別のパスに移動することです (ストリーミング センサー データを表示するため)。管理ビューで、このコードを使用してスタックから管理者ログイン ビューを削除します

- (void)viewDidLoad
{
[super viewDidLoad];

NSMutableArray *navStack = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];
NSMutableArray *navBarBrian = [[NSMutableArray alloc] initWithArray: [[[self navigationController] navigationBar] items] ];
UINavigationBar *navBar = [[UINavigationBar alloc] init];
navBar = self.navigationController.navigationBar;
NSLog(@"navStack = %@", navStack);
NSLog(@"navBar = %@", [[self navigationController] navigationBar]);
NSLog(@"navBarItems = %@", [[[self navigationController] navigationBar] items]);
NSLog(@"navBarBrian = %@", navBarBrian);
NSLog(@"navBarList = %@", navBar);
[navStack removeObjectAtIndex: [navStack count] - 2];
[navBarBrian removeObjectAtIndex:[navBarBrian count] - 1];
//    self.navigationController.viewControllers = navStack;
[self.navigationController setViewControllers:navStack animated:NO];    

//    [navBar popNavigationItemAnimated:NO];
//    [[[self navigationController] navigationBar] popNavigationItemAnimated:NO];
//    [[[self navigationController] navigationBar] setItems:navBarBrian animated:NO]; 
NSLog(@"navStack = %@", navStack);
NSLog(@"navBar = %@", [[self navigationController] navigationBar]);
NSLog(@"navBarItems = %@", [[[self navigationController] navigationBar] items]);
NSLog(@"navBarBrian = %@", navBarBrian);

}

そのため、管理ビューから戻ると、アプリはメイン ビュー画面に移動します。ただし、ナビゲーション バーのタイトルには引き続き管理者ログインと表示され、[メイン] を指す [戻る] ボタンがあります。ナビゲーション バー自体からナビゲーション アイテムをポップしようとしましたが、例外がスローされます。ナビゲーション アイテムのリストを取得して navBarBrian に保存し、管理者ログイン画面のナビゲーション アイテムを自分の navBarBrian 配列から削除することもできます。たとえば、navBarBrian のオブジェクトを削除する前に、次のことを行います。

2013-11-06 11:59:25.457 BikeComm[703:a0b] navBarItems = (「UINavigationItem: 0xa8a4cd0」、「UINavigationItem: 0xa8c4f40」)

2013-11-06 11:59:25.457 BikeComm[703:a0b] navBarBrian = (「UINavigationItem: 0xa8a4cd0」、「UINavigationItem: 0xa8c4f40」)

その後、私が持っている除去

2013-11-06 11:59:25.458 BikeComm[703:a0b] navBarItems = (「UINavigationItem: 0xa8a4cd0」、「UINavigationItem: 0xa8c4f40」)

2013-11-06 11:59:25.459 BikeComm[703:a0b] navBarBrian = (「UINavigationItem: 0xa8a4cd0」)

ただし、これも例外をスローするため、setItems メソッドを使用して navBarBrian のコンテンツをナビゲーション バーに保存することはできません。コントローラーによって管理される UINavigationBar。」

では、それぞれのスタックからビューとナビゲーション アイテムの両方を削除する秘訣は何でしょうか?

4

1 に答える 1

0

ここで何をしようとしているのかちょっと混乱しています...しかし、あなたのしていることはとてもぎこちないようです。通常、このような問題が発生した場合は、UI に何か問題があります。

通常、ログイン画面はモーダル ビューであり、ナビゲーション コントローラーの一部ではありません。あなたがしていることは、本当にする必要はありません。

メイン画面からログインをモーダルにし、メインのリッスンでログイン画面のデリゲートを作成するかもしれません。ログインしたら、デリゲートを呼び出してモーダルを閉じます。次に、メインのデリゲートリスナーメソッドで、ログインが成功した場合は、管理画面を押します。その後、ログインをバイパスする必要はありません。

それが理にかなっていれば。

また、 iOS ヒューマン インターフェイス ガイドラインを読んで、どの UI 要素がどのような状況で最適に機能するかを理解することをお勧めします。

于 2013-11-06T19:51:13.930 に答える