最初のビューコントローラーがUIを持たない「意思決定者」クラスであるNavigationControllerを使用しています。そのため、ルートとしてローカルデータベースがチェックされ、特定のアイテムがある場合は意思決定者VCが特定のVCをプッシュし、アイテムがない場合は別のVCをプッシュします。つまり、2本の枝がある木のようなものです。
ブランチ1のある時点で、いくつかのVCがスタックにプッシュされ、ユーザーが最後の「アイテム」を削除する可能性があるため、popToRootViewControllerAnimatedを呼び出して、意思決定者がブランチ2に正しくルーティングされるようにします。すべてが正常に機能します。 、ナビゲーションバーを除いて、ブランチ1にあった最後のVCのタイトルを含むブランチ2の最初のVCの戻るボタンを取り除くことができません。
ナビゲーションを図式的に示します(一種):
NavController
DecisionMaker
branch1VC1
branch1VC2
branch1VC3
branch2VC1
branch2VC2
branch1VC3にいて、最後のアイテムを削除してからpopToRootViewControllerAnimatedを呼び出すと、DecisionMakerを通過し、branch2VC1に正しく到達しますが、「branch1VC3」というラベルの付いた戻るボタンがあります。ボタンを押しても、ボタンは何もしません。また、下部のナビゲーションバーにある別のボタン([概要]ページに移動します)をクリックすると、[概要]ページの上部に表示される通常の戻るボタンが表示されないため、戻る。基本的に、ナビゲーションはこの時点でねじ込まれます。
私が試してみました:
- 宛先VC(branch2VC1)でself.navigationItem.hidesBackButton = YESを呼び出しますが、機能しません。
- 同じようにself.navigationItem.backBarButtonItem=NULLを呼び出します。
- self.navigationItem.leftBarButtonItem = NULLを同じように呼び出します(これらはすべてviewDidLoadとviewWillAppearの両方で試行されました)
- DecisionMakerVCでself.titleをnullに設定します。これには、戻るボタン内のテキストを「戻る」に変える効果がありますが、VCへの移動が終了するとまだそこにあります。
- 私がスタック上にあると思ったVCが間違いなくあったことを確認するためのデバッグ。つまり、DecisionMaker VC内には1つ(それ自体)しかなく、branch2VC1内には2つあります。
基本的に、私には、他のブランチへの新しいプッシュと同じUIサイクルにあるポップからルートへのアクションが問題のように思われます。しかし、なぜそれができないのかわかりません。このSEの質問はおそらく同じだと思いますが、実際には答えがありませんでした。
編集: 解決策は、カスタムロジックとナビゲーションを実行する前に、DecisionMakerVCでsuper.viewWillAppearを呼び出すことでした。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self decideViewController];
}