0

最初のビューコントローラーが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];
}
4

1 に答える 1

0

ビュー階層が にプッシュされた場合viewWillAppear、または新しい UI が正しくロードされる前のどこかに問題が発生することはほとんどありません。新しいビューが正しいタイミングでプッシュされていることを確認してください。

于 2013-01-02T09:03:38.303 に答える